2015-07-21 66 views
4

一切工作正常與此代碼(縮短它爲更好的閱讀)。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 
     } 
    } 
} 

回答

5

你必須使用連接池來發送廣播消息到所有連接。 您可以使用它作爲教程/樣本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在例子是,我們需要廣播消息的通道。
我們使用select語句的default部分刪除具有完整或受阻發送通道的連接。見What is the benefit of sending to a channel by using select in Go?

+0

我們可以提取一些示例代碼放在這裏嗎?以防鏈接死亡。 http://meta.stackexchange.com/a/8259/306913 – HectorJ

+1

我編輯了我的答案。希望它夠了 – RoninDev

相關問題