为了账号安全,请及时绑定邮箱和手机立即绑定

在多个客户端之间并发中继数据

在多个客户端之间并发中继数据

Go
沧海一幻觉 2021-12-27 15:33:07
我目前正在开发一个应用程序,使用 WebSockets 将手机通过服务器发送的数据中继到浏览器。我正在用 go 编写服务器,手机和浏览器之间是一对一的关系,如下图所示。但是,我希望多个会话同时工作。我读过 go 提供了并发模型,这些模型遵循使用 goroutines 和通道的“通过通信共享内存”的原则。我更喜欢使用上述原则而不是使用sync.Mutex原语锁定。尽管如此,我还是无法将这些信息映射到我的问题上,想请教您是否可以提出解决方案。
查看完整描述

2 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

我遇到了与您的问题类似的问题,我需要多个连接,每个连接都通过多个服务器相互发送数据。


我使用了WAMP协议


WAMP is an open standard WebSocket subprotocol that provides two application messaging patterns in one unified protocol:

Remote Procedure Calls + Publish & Subscribe.

你也可以看看我的一个项目,它是用 go 编写的,并使用了手头的协议:github.com/neutrinoapp/neutrino


查看完整回答
反对 回复 2021-12-27
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

在 Go 中使用互斥锁并没有错。这是使用互斥锁的解决方案。


声明端点映射。我假设字符串键足以识别端点:


type endpoint struct {

    c *websocket.Conn

    sync.Mutex  // protects write to c

}


var (

   endpoints = map[string]*endpoint

   endpointsMu sync.Mutex   // protects endpoints

)


func addEndpoint(key string, c *websocket.Connection) {

   endpointsMu.Lock()

   endpoints[key] = &endpoint{c:c}

   endpointsMu.Unlock()

}


func removeEndpoint(key string) {

    endpointsMu.Lock()

    delete(endpoints, key)

    endpointsMu.Unlock()

}


func sendToEndpoint(key string, message []byte) error {

    endpointsMu.Lock()

    e := endpoints[key]

    endpointsMu.Unlock()

    if e === nil {

        return errors.New("no endpoint")

    }

    e.Lock()

    defer e.Unlock()

    return e.c.WriteMessage(websocket.TextMessage, message)

}

addEndpoint当客户端连接时,将连接添加到地图。removeEndpoint关闭连接时从地图中删除连接。使用 将消息发送到命名端点sendToEndpoint。


该大猩猩聊天例如可以适用于解决这个问题。将集线器映射更改为connections map[string]*connection,更新通道以发送具有连接和密钥的类型,并将广播循环更改为发送到单个连接。


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信