Panduan Pembangunan Soket Web golang: Melaksanakan fungsi kerjasama dalam talian berbilang orang

王林
Lepaskan: 2023-12-02 12:18:58
asal
1030 orang telah melayarinya

golang Websocket开发指南:实现多人在线协作功能

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

  1. 3. Proses pembangunan Golang Websocket
  2. Import perpustakaan yang diperlukan

    Import pustaka "golang.org/x/net/websocket" dan "github.com/gorilla/websocket".
    • Tentukan kumpulan sambungan
    • Kod sampel seterusnya akan menggunakan kumpulan sambungan global untuk mengurus sambungan Websocket semua pelanggan untuk mencapai fungsi kerjasama dalam talian berbilang orang. Tentukan kumpulan sambungan jenis struktur Medan dalam struktur termasuk mutex dan kepingan untuk menyimpan sambungan.
    • type ConnPool struct { connLock sync.Mutex conns []*websocket.Conn }
      Salin selepas log masuk
Mengendalikan permintaan WebSocket

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) }
Salin selepas log masuk

  1. Logik pemprosesan mesej
  2. Dalam kod sampel, kami menggunakan goroutine untuk mengendalikan penghantaran dan penerimaan mesej untuk setiap sambungan. Dengan membaca mesej pada sambungan, fungsi kerjasama dalam talian berbilang orang direalisasikan. Apabila mesej baharu dihantar, semua sambungan dilalui melalui kolam sambungan dan mesej dihantar.
  3. 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) } }
    Salin selepas log masuk


    Mulakan Pelayan Websocket
  4. Tulis fungsi untuk memulakan Pelayan Websocket. Dalam fungsi ini, kita perlu mencipta contoh pelayan Http dan mengikat fungsi yang mengendalikan permintaan Websocket.
  5. func startServer() { http.HandleFunc("/ws", wsHandler) http.ListenAndServe(":8000", nil) }
    Salin selepas log masuk


    Kod contoh lengkap
  6. Berikut ialah kod contoh aplikasi Websocket yang lengkap:
  7. 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() }
    Salin selepas log masuk


    Four. :8000, Anda boleh memasuki halaman aplikasi Websocket.
  8. Buka halaman ini dalam berbilang tetingkap penyemak imbas untuk menunjukkan fungsi kerjasama dalam talian berbilang orang. Selepas anda memasukkan mesej dalam mana-mana tetingkap, tetingkap lain menerima mesej itu.


    Kesimpulan:
  9. Artikel ini memperkenalkan cara menggunakan Golang untuk membangunkan aplikasi Websocket, dan melalui contoh kod khusus, menunjukkan cara merealisasikan fungsi kerjasama dalam talian berbilang orang. Saya harap artikel ini akan membantu anda memahami dan menggunakan Golang Websocket!

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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!