每个客户端强制执行1个唯一的websocket连接



我有一个网页,它与服务器建立了websocket连接。我必须确保该网站的用户只能建立一个连接,因此打开一个新选项卡并导航到同一页面将关闭以前的连接。

我想维护一个以会话id为密钥的地图;然而,由于随着越来越多的客户端连接,映射的大小必须不断调整,我担心它会出现性能问题,而且由于它是并发访问的,您可能不得不进行某种锁定。

对于确保每个客户端都有唯一连接的高效性能方法,有什么想法吗?很乐意听取建议,谢谢。

我不会关心问题中概述的解决方案的性能。如果您想关闭以前的连接,就无法维护服务器端映射。假设只有一台服务器,并且您使用的是Gorilla websocket包,那么以下代码应该可以完成任务:

var (
   mu sync.Mutex
   conns map[string]*websocket.Conn
)
func addConn(sessionID string, conn *websocket.Conn) {
   mu.Lock()
   prev := conns[sessionID]
   conns[sessionID] = conn
   mu.Unlock()
   if prev != nil {
      // Close will stop concurrent reads and writes.
      prev.Close()
   }
}
func removeConn(sessionID string, conn *websocket.Conn) {
   mu.Lock()
   // We don't simply delete(conns, session) to avoid race on cleanup.
   if conns[sessionID] == conn {
      delete(conns, sessionID)
   }
   mu.Unlock()
}

与接受传入网络连接、完成websocket握手以及场景中发生的其他一切的成本相比,更新此映射的成本很小。

相关内容

  • 没有找到相关文章

最新更新