2014-03-30 66 views
0

我正在創建Web瀏覽器黑白棋遊戲。我使用SignalR進行通信。我已經在服務器和一個客戶端之間實現了2方通信。現在我遇到了一個問題。發送消息給已過濾的客戶端

有多個遊戲在同一時間進行。每場比賽有2名球員。我想通過推送通知使用異步通信。更確切地說,當我決定時間沒有通知玩家我想推送通知給他們的東西。但是不是給所有的玩家,只能把兩個連接到某個遊戲。

到目前爲止(將數據發送回給調用者),我這樣做是:

Clients.Caller.GameStatusUpdated(status); 

這樣我可以不叫第二的球員。我以爲我可以存儲Clients.Caller對象,但我發現每一次調用(即使來自同一個客戶端集線器,仍然連接)都會創建一個服務器集線器的新實例。 Clients.Caller的哈希碼每次都不相同。

什麼是正確的方式去這裏?

回答

1

You can take a loot at groups

當用戶加入遊戲,你只需將其添加到組:

public Task JoinRoom(string roomName) 
{ 
    return Groups.Add(Context.ConnectionId, roomName); 
} 

只要確保你有每場比賽的一組(每場比賽也就是一個ROOMNAME)。

然後你就可以在同一組中的所有用戶進行通信(在本例中,ROOMNAME)

Clients.Group(roomName).GameStatusUpdated(status) 

要退出羣組:

public Task LeaveRoom(string roomName) 
{ 
    return Groups.Remove(Context.ConnectionId, roomName); 
} 

組是不是唯一的解決辦法。您可以使用內存映射或數據庫映射。 Take a look here.

3

我認爲SignalR groups會解決你的問題。我想你會想把每個單獨的遊戲的每個玩家添加到一個獨特的團體。然後你就可以使用Clients.Group(game). GameStatusUpdated(status)來告訴個別遊戲組關於更新。

相關問題