golang の Websocket チャットルームをどのように実装するか

Go言語によるWebsocket チャットルームを実装するには、以下の手順に従ってください。

  1. 必要なパッケージをインポートします:
import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)
  1. WebSocket接続用のアップグレードを定義します:
var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}
  1. チャットルーム
  2. お客様
type ChatRoom struct {
    clients map[*websocket.Conn]bool
}
  1. WebSocketハンドリング
func (c *ChatRoom) handleWebSocket(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    c.clients[conn] = true // 将新连接的客户端加入到映射表中

    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            delete(c.clients, conn) // 若发生错误,删除该连接
            return
        }

        for client := range c.clients {
            err := client.WriteMessage(messageType, p)
            if err != nil {
                log.Println(err)
                client.Close()
                delete(c.clients, client) // 若发生错误,删除该连接
            }
        }
    }
}
  1. 彼女は立ち止まって話しかけ、その男は振り返って彼女の横にいる友人の笑顔が眩しかったのを見て驚いた。
  2. チャットルーム
func main() {
    chatRoom := &ChatRoom{
        clients: make(map[*websocket.Conn]bool),
    }

    http.HandleFunc("/ws", chatRoom.handleWebSocket)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

こうすることで、シンプルなgolang WebSocketチャットルームが実現できました。新しいクライアントが接続してきた際にはclients連想配列に追加し、各クライアントからのメッセージを受信するたび、それをほかの接続済みクライアント全員にブロードキャストします。エラーが発生したら、その接続を閉じてclients連想配列から削除する必要があります。

bannerAds