8 votes

Application de fonction Azure et SignalR

Je suis en train de construire un petit jeu qui sera piloté par un web socket utilisant SignalR d'un côté et une application de fonction Azure de l'autre. Fondamentalement, l'utilisateur établit une connexion web socket avec le serveur et envoie/reçoit des messages de celui-ci. Cela se fait principalement de cette manière car les joueurs peuvent discuter entre eux en temps réel.

En outre, j'aimerais avoir quelques applications de fonction Azure qui s'exécutent et exécutent certaines instructions. Par exemple, chaque minute, une application ferait déplacer certains monstres. Si ces monstres se trouvent autour d'un joueur spécifique, j'aimerais qu'il le sache.

Pour cela, j'ai deux solutions en tête:

  • Demander les informations chaque seconde au client, puis avertir l'utilisateur s'il le faut.
  • Ouvrir une connexion à mon web socket depuis mon application de fonction pour envoyer les données et le hub transmettrait les informations aux utilisateurs concernés.

La première option semble un peu contre-productive pour moi. À quoi bon avoir un web socket si je dois interroger le serveur pour obtenir des informations.

La deuxième option semble meilleure mais comme je ne suis pas encore familier avec les applications de fonction, je me demande si c'est la bonne voie à suivre. Est-il possible/correct d'ouvrir une connexion web socket depuis une application de fonction?

Peut-être y a-t-il de meilleures options?

18voto

Fei Han Points 10211

Par exemple, chaque minute, une application ferait bouger certains monstres. Si ces monstres se trouvent autour d'un joueur spécifique, je voudrais qu'il le sache.

Si vous souhaitez appeler la méthode hub depuis votre application Azure Functions pour diffuser des informations sur la position des monstres à des joueurs spécifiques, vous pouvez consulter l'exemple suivant qui fonctionne bien de mon côté.

Classe Hub

public class ChatHub : Hub
{       

    public void BroadcastMonstersPosition(string MonsterPositionInfo)
    {
        Clients.All.addNewMessageToPage(MonsterPositionInfo);
    }

    //autres méthodes du hub
}  

Application Azure Functions (timerTrigger)

using System;

public static void Run(TimerInfo myTimer, TraceWriter log)
{
    var hub = new Microsoft.AspNet.SignalR.Client.HubConnection("http://xxxxxx.azurewebsites.net/signalr/hubs");

    var proxy = hub.CreateHubProxy("ChatHub");
    hub.Start().Wait();

    //appeler la méthode du hub
    proxy.Invoke("BroadcastMonstersPosition", "new position info");
    log.Info($"La fonction de déclenchement du minuteur C# s'est exécutée à : {DateTime.Now}");
}

function.json

{
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 */1 * * * *"
    }
  ],
  "disabled": false
}

project.json

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Microsoft.AspNet.SignalR.Client": "2.2.0"
      }
    }
   }
}

L'utilisateur client peut recevoir le message envoyé par l'application Azure Functions

description de l'image

En outre, si vous souhaitez diffuser des informations à des joueurs spécifiques au lieu de tous les joueurs connectés, vous pouvez vous référer au code suivant.

Clients.Clients(clientids_list).addNewMessageToPage(MonsterPositionInfo);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X