2017-08-15 158 views
-5

我想在我的web应用程序中实现实时通知功能。我正在关注这个例子“https://github.com/gorilla/websocket/tree/master/examples/chat”。我需要服务器(集线器)来获取消息,它需要根据某种形式的ID将这些消息推送给各个客户端。我怎样才能做到这一点?实时推送通知golang

+5

你试过了吗?你能发布一个[最小的,完整的,可验证的例子](https://stackoverflow.com/help/mcve)并解释它如何不按预期工作? – Adrian

+0

@ Adrian-I有示例聊天应用程序。不知道如何仅将msg发送给某些用户。现在,味精被发送到所有连接的客户端。 – amanda45

+0

那么你的代码在哪里? – Flimzy

回答

0

从样品中你提到:

case message := <-h.broadcast: 
     for client := range h.clients { 
      select { 
      case client.send <- message: 
      default: 
       close(client.send) 
       delete(h.clients, client) 
      } 
     } 
    } 

这是一个消息被广播到所有客户端的情况。正如你所看到的,它遍历所有注册的客户端,并将消息发送给它们中的每一个。

为了保留此功能,我们将简单地添加另一个案例:发送给单个客户端。

case message := <-h.clientMessage: 
     for client := range h.clients { 
      if message.ClientID == client.ID { 
       select { 
       case client.send <- message: 
       default: 
        close(client.send) 
        delete(h.clients, client) 
       } 
      } 
     } 
    } 

这应该给你一个想法。剩下的我留给你。

注意:我的示例代码可以通过如下方式进行优化:使用map[clientID]Client直接访问客户端。

+0

@ TehSphinX-如何在连接创建时发送Client.ID?我需要Client.ID以匹配会话值 – amanda45

+0

当我连接时,我可以在cookie中发送会话Id吗?所以地图可以映射[SessionID]客户端? – amanda45

+0

SessionID(或ClientID)来自服务器,而不是客户端。当新客户端连接服务器时,应为其分配一个唯一的ID。你可能会巧妙地使用已经由你使用的任何服务器创建的SessionID。 – TehSphinX