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

时间:2015-07-21 07:18:56

标签: go websocket

使用此代码一切正常(缩短它以便更好地阅读)。

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

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

我该怎么做?适合初学者的任何示例或精彩教程?

提前致谢!

服务器:

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
      }
    }
}

1 个答案:

答案 0 :(得分:6)

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

简化:
连接池是已注册连接的集合。见hub.connections

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

    ...
}

要为所有客户端广播消息,我们将迭代连接池,如下所示:

    case m := <-h.broadcast:
        for c := range h.connections {
            select {
            case c.send <- m:
            default:
                delete(h.connections, c)
                close(c.send)
            }
        }
    }
该示例中的

h.broadcast是一个包含我们需要广播的消息的频道 我们使用default语句的select部分删除与完整或阻止发送渠道的连接。见What is the benefit of sending to a channel by using select in Go?