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

我目前正在开发一个应用程序,使用 WebSockets 将手机通过服务器发送的数据中继到浏览器。我正在用 go 编写服务器,手机和浏览器之间是一对一的关系,如下图所示。

http://img1.mukewang.com/61c96c450001ef7b25600281.jpg

但是,我希望多个会话同时工作。

我读过 go 提供了并发模型,这些模型遵循使用 goroutines 和通道的“通过通信共享内存”的原则。我更喜欢使用上述原则而不是使用sync.Mutex原语锁定。

尽管如此,我还是无法将这些信息映射到我的问题上,想请教您是否可以提出解决方案。


沧海一幻觉
浏览 133回答 2
2回答

萧十郎

我遇到了与您的问题类似的问题,我需要多个连接,每个连接都通过多个服务器相互发送数据。我使用了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

猛跑小猪

在 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,更新通道以发送具有连接和密钥的类型,并将广播循环更改为发送到单个连接。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go