SignalR需要针对具有游戏ID的特定游戏,而不是所有实时游戏

时间:2018-07-13 22:44:48

标签: signalr signalr-hub signalr.client signalr-2

我没有考虑这个问题,但是这段代码将游戏模型发送给了所有客户。我需要使用此控制器操作中的GameID,并且仅定位观看该游戏的客户。我该怎么办?

发布控制器操作

public UpdateGameResponse UpdateGame(int gameId)
        {

...

 var model = Game.Create(XDocument.Load(httpRequest.Files[0].InputStream)).Parse();


         GlobalHost.ConnectionManager.GetHubContext<GameCastHub>().Clients.All.receiveUpdates(Newtonsoft.Json.JsonConvert.SerializeObject(model));

}

中心

 [HubName("gamecastHub")]
    public class GameCastHub : Hub
    {
    }

客户

  var connected = false;
                var gamecastHub = $.connection.gamecastHub;

                if (gamecastHub) {

                    gamecastHub.client.receiveUpdates = function (updates) {
                        console.log('New updates received');
                        processUpdates(updates);
                    };

                    connectLiveUpdates();

                    $.connection.hub.connectionSlow(function () {
                        console.log('Live updates connection running slow');
                    });

                    $.connection.hub.disconnected(function () {
                        connected = false;
                        console.log('Live updates disconnected');
                        setTimeout(connectLiveUpdates, 10000);
                    });

                    $.connection.hub.reconnecting(function () {
                        console.log('Live updates reconnecting...');
                    });

                    $.connection.hub.reconnected(function () {
                        connected = false;
                        console.log('Live updates reconnected');
                    });
                }

1 个答案:

答案 0 :(得分:0)

我建议使用与到集线器的每个连接关联的连接ID或创建组。 注意:每个GameID必须与集线器拥有自己的连接,才能使用连接ID解决方案。

我更喜欢根据个人经验来使用小组,但是任何一种方式都可以做到。

要在中心中创建组,您将需要在中心类中创建方法。

public async void setGroup(string groupName){
    await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
}

第二,您需要在客户端使用JS函数来调用集线器函数。

$.connection.hub.invoke("setGroup", groupName).catch(err => console.error(err.toString()));

根据您的情况,您可以将游戏ID放置为groupname,然后致电GlobalHost.ConnectionManager.GetHubContext<GameCastHub>().Clients.Groups(gameID).receiveUpdates(Newtonsoft.Json.JsonConvert.SerializeObject(model));

要检索连接ID:

var _connectionId = $.connection.hub.id;

然后将连接ID​​发送到服务器, 并继续使用呼叫GlobalHost.ConnectionManager.GetHubContext<GameCastHub>().Clients.Clients.Client(_connectionId).receiveUpdates(Newtonsoft.Json.JsonConvert.SerializeObject(model));来呼叫该特定连接。