我正在构建一个小型游戏,一方面使用SignalR,另一方面使用Azure功能应用程序。基本上,用户与服务器建立Web套接字连接并从中发送/接收消息。这主要是通过这种方式完成的,因为玩家可以实时互相讨论。
此外,我想要一些运行并执行一些指令的Azure功能应用程序。例如,每分钟,一个应用程序会让一些怪物移动。如果这些怪物围绕特定的玩家,我希望他知道。
为此,我有两个解决方案:
第一种选择是打败了我的网络套接字的目的。如果我需要在服务器上汇集一些信息,那么拥有Web套接字有什么意义。
第二个选项似乎更好但是因为我还不熟悉功能应用程序,我想知道它是否可行。从功能应用程序打开Web套接字连接是否可能/正确?
也许有更好的选择?
答案 0 :(得分:18)
例如,每分钟,一个应用程序会让一些怪物移动。如果这些怪物围绕特定的玩家,我希望他知道。
如果您想从Azure功能应用程序调用hub方法向特定玩家广播怪物位置信息,您可以参考以下可以正常使用的示例。
集线器类
public class ChatHub : Hub
{
public void BroadcastMonstersPosition(string MonsterPositionInfo)
{
Clients.All.addNewMessageToPage(MonsterPositionInfo);
}
//other hub methods
}
Azure功能应用(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();
//invoke hub method
proxy.Invoke("BroadcastMonstersPosition", "new position info");
log.Info($"C# Timer trigger function executed at: {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"
}
}
}
}
客户端用户可以接收Azure功能应用发送的消息
此外,如果你想广播给特定的玩家而不是所有连接玩家,你可以参考以下代码。
Clients.Clients(clientids_list).addNewMessageToPage(MonsterPositionInfo);