我正在创建一个网页浏览器黑白棋游戏。我使用SignalR进行通信。我已经在服务器和一个客户端之间实现了2方通信。现在我遇到了一个问题。
同时有多个游戏在进行。每场比赛有2名球员。我想使用推送通知的异步通信。更准确地说,当我决定时间没有通知玩家我想要通知他们的事情。但不给所有玩家,只有两个连接到某个游戏。
到目前为止(将数据发送回调用者)我这样做:
Clients.Caller.GameStatusUpdated(status);
这样我就不能给第二个玩家打电话了。我以为我可以存储Clients.Caller对象,但我发现每个调用(甚至来自同一个客户端集线器,仍然连接)都会创建服务器集线器的新实例。 Clients.Caller的哈希码每次都不同。
什么是正确的方式去这里?
答案 0 :(得分:3)
我认为SignalR groups会解决您的问题。我想你想要将每个游戏的每个玩家添加到一个独特的组中。然后,您就可以使用Clients.Group(game). GameStatusUpdated(status)
告诉单个游戏组有关更新的信息。
答案 1 :(得分:1)
当用户加入游戏时,您只需将其添加到群组中:
public Task JoinRoom(string roomName)
{
return Groups.Add(Context.ConnectionId, roomName);
}
确保每场比赛有一组(即每场比赛一个名称)。
然后,您可以与同一组中的所有用户(在我们的示例中为roomName)进行通信
Clients.Group(roomName).GameStatusUpdated(status)
离开小组:
public Task LeaveRoom(string roomName)
{
return Groups.Remove(Context.ConnectionId, roomName);
}
群组不是唯一的解决方案。您可以使用内存映射或数据库映射。 Take a look here.