Panduan Pembangunan Golang Websocket: Melaksanakan fungsi kerjasama dalam talian berbilang orang
Pengenalan:
Websocket ialah protokol komunikasi yang mewujudkan sambungan berterusan antara pelanggan dan pelayan Ia boleh membolehkan pelayan menghantar mesej secara aktif kepada pelanggan Fungsi. Dalam aplikasi praktikal, Websocket digunakan secara meluas dalam pemberitahuan masa nyata, bilik sembang, kerjasama dalam talian berbilang orang dan senario lain. Artikel ini akan memperkenalkan cara menggunakan Golang untuk membangunkan aplikasi Websocket dan menggabungkannya dengan contoh kod untuk menunjukkan cara melaksanakan kerjasama dalam talian berbilang orang.
1. Pengenalan kepada Golang Websocket
Golang dilengkapi dengan perpustakaan Websocket terbina dalam untuk memudahkan pembangun membina aplikasi Websocket dengan cepat. Menggunakan pustaka Websocket Golang, anda boleh melaksanakan fungsi Websocket dengan mudah seperti sambungan, penghantaran dan penerimaan mesej serta pengurusan kumpulan sambungan. Konfigurasi persekitaran pembangunan Golang Websocket
Import perpustakaan yang diperlukan
Import pustaka "golang.org/x/net/websocket" dan "github.com/gorilla/websocket".type ConnPool struct { connLock sync.Mutex conns []*websocket.Conn }
Di Golang, permintaan HTTP boleh dipantau dan diproses melalui pakej Http. Kita perlu menulis fungsi yang mengendalikan permintaan Websocket dan mendaftarkan fungsi dalam pelayan HTTP.
func wsHandler(w http.ResponseWriter, r *http.Request) { conn, err := websocket.Upgrade(w, r, nil, 1024, 1024) if err != nil { log.Println("websocket upgrade failed:", err) return } // 将连接添加到连接池中 pool.add(conn) // 具体的消息处理逻辑 go handleMessages(conn) }
func handleMessages(conn *websocket.Conn) { for { message := "" err := conn.ReadJSON(&message) if err != nil { log.Println("read message failed:", err) // 从连接池中删除连接 pool.remove(conn) break } // 遍历连接池,广播消息 pool.broadcast(message) } }
func startServer() { http.HandleFunc("/ws", wsHandler) http.ListenAndServe(":8000", nil) }
package main import ( "log" "net/http" "sync" "github.com/gorilla/websocket" ) type ConnPool struct { connLock sync.Mutex conns []*websocket.Conn } var pool ConnPool func (p *ConnPool) add(conn *websocket.Conn) { p.connLock.Lock() defer p.connLock.Unlock() p.conns = append(p.conns, conn) } func (p *ConnPool) remove(conn *websocket.Conn) { p.connLock.Lock() defer p.connLock.Unlock() newConns := make([]*websocket.Conn, 0, len(p.conns)-1) for _, c := range p.conns { if c != conn { newConns = append(newConns, c) } } p.conns = newConns } func (p *ConnPool) broadcast(message string) { p.connLock.Lock() defer p.connLock.Unlock() for _, conn := range p.conns { err := conn.WriteJSON(message) if err != nil { log.Println("write message failed:", err) } } } func wsHandler(w http.ResponseWriter, r *http.Request) { conn, err := websocket.Upgrade(w, r, nil, 1024, 1024) if err != nil { log.Println("websocket upgrade failed:", err) return } pool.add(conn) go handleMessages(conn) } func handleMessages(conn *websocket.Conn) { for { message := "" err := conn.ReadJSON(&message) if err != nil { log.Println("read message failed:", err) pool.remove(conn) break } pool.broadcast(message) } } func startServer() { http.HandleFunc("/ws", wsHandler) http.ListenAndServe(":8000", nil) } func main() { startServer() }
Atas ialah kandungan terperinci Panduan Pembangunan Soket Web golang: Melaksanakan fungsi kerjasama dalam talian berbilang orang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!