首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GO Websocket向所有客户端发送消息

问GO Websocket向所有客户端发送消息
EN

Stack Overflow用户
提问于 2015-07-21 15:18:56
回答 1查看 10.7K关注 0票数 4

使用这段代码一切都很好(为了更好地阅读,缩短了代码)。

当Client1向服务器发送请求时,服务器立即响应他。但是,其他客户端看不到响应消息。

因此,我想让它更进一步:当客户端向服务器发送请求时,服务器将响应所有客户端,以便所有客户端都能看到消息。

我该怎么做呢?有没有适合初学者的例子或教程?

提前感谢!

服务器:

代码语言:javascript
复制
import (
        "github.com/gorilla/websocket"
       )

func main() {
    http.Handle("/server", websocket.Handler(echoHandler)) 
}

func echoHandler(ws *websocket.Conn) {
    conn, err := upgrader.Upgrade(w, r, nil) 
    if err != nil { 
      return
    }
    for {
      messageType, p, err := conn.ReadMessage() 
      if err != nil {
        return
      }

      print_binary(p) // simple print of the message

      err = conn.WriteMessage(messageType, p);
      if err != nil {
        return
      }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-21 15:22:27

您必须使用连接池将消息广播到所有连接。您可以将其用作教程/示例http://gary.burd.info/go-websocket-chat

简化:

连接池是已注册连接的集合。请参阅hub.connections

代码语言:javascript
复制
type connection struct {
    // The websocket connection.
    ws *websocket.Conn

    // Buffered channel of outbound messages.
    send chan []byte

    // The hub.
    h *hub
}

type hub struct {
    // Registered connections. That's a connection pool
    connections map[*connection]bool

    ...
}

为了向所有客户端广播消息,我们像这样遍历连接池:

代码语言:javascript
复制
    case m := <-h.broadcast:
        for c := range h.connections {
            select {
            case c.send <- m:
            default:
                delete(h.connections, c)
                close(c.send)
            }
        }
    }

该示例中的h.broadcast是一个包含我们需要广播的消息的通道。

我们使用select语句的default部分来删除发送通道已满或被阻塞的连接。请参阅What is the benefit of sending to a channel by using select in Go?

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31532652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档