Rumah > Artikel > pembangunan bahagian belakang > Panduan Pengaturcaraan WebSocket Golang: Membina aplikasi masa nyata berprestasi tinggi
Panduan Pengaturcaraan WebSocket Golang: Membina aplikasi masa nyata berprestasi tinggi
Pengenalan:
Dengan perkembangan pesat Internet, keperluan untuk komunikasi masa nyata menjadi semakin mendesak. Sebagai protokol komunikasi dua hala, WebSocket boleh mewujudkan sambungan berterusan antara penyemak imbas dan pelayan, menyediakan penyelesaian yang cekap dan boleh dipercayai untuk aplikasi masa nyata. Artikel ini akan memperkenalkan cara menggunakan Golang untuk membina aplikasi masa nyata berprestasi tinggi dan memberikan contoh kod khusus.
1 Apakah itu protokol WebSocket? Protokol WebSocket ialah protokol berasaskan TCP Dengan mewujudkan sambungan dupleks penuh yang berterusan antara penyemak imbas dan pelayan, pelayan boleh menolak data secara aktif untuk mencapai komunikasi masa nyata. . Berbanding dengan protokol HTTP tradisional, protokol WebSocket mempunyai kelebihan berikut:
Golang, sebagai bahasa pengaturcaraan berprestasi tinggi, menyediakan perpustakaan standard yang mudah dan mudah digunakan untuk mengendalikan komunikasi WebSocket. Berikut ialah contoh kod untuk pelayan WebSocket mudah:
package main import ( "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func main() { http.HandleFunc("/echo", echoHandler) log.Fatal(http.ListenAndServe(":8080", nil)) } func echoHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Fatal("upgrade error:", err) } defer conn.Close() for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println("read error:", err) break } log.Println("receive:", string(message)) err = conn.WriteMessage(messageType, message) if err != nil { log.Println("write error:", err) break } } }Dalam kod di atas, permintaan WebSocket dipetakan kepada
melalui fungsi <code>http.HandleFunc
dan laluan /echo
echoHandler fungsi. Dalam fungsi echoHandler
, kami menggunakan websocket.Upgrader
untuk meningkatkan sambungan HTTP kepada sambungan WebSocket dan mendapatkan contoh websocket.Conn
. Pelayan WebSocket Echo yang ringkas dilaksanakan dengan membaca mesej dalam conn
dan menulis mesej yang sama. http.HandleFunc
函数和路由/echo
将WebSocket请求映射到echoHandler
函数。在echoHandler
函数中,我们使用websocket.Upgrader
来升级HTTP连接为WebSocket连接,并得到一个websocket.Conn
实例。通过读取conn
中的消息并写入相同的消息,实现了一个简单的WebSocket Echo服务器。
三、实时聊天室示例
以上示例只实现了简单的消息回显功能。下面,我们将展示如何使用Golang构建一个实时聊天室,其中多个用户可以同时进行实时通信。
package main import ( "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } type Message struct { Username string `json:"username"` Content string `json:"content"` } type Room struct { clients map[*websocket.Conn]bool broadcast chan Message join chan *websocket.Conn leave chan *websocket.Conn } func (r *Room) start() { for { select { case conn := <-r.join: r.clients[conn] = true case conn := <-r.leave: delete(r.clients, conn) close(conn) case message := <-r.broadcast: for conn := range r.clients { err := conn.WriteJSON(message) if err != nil { log.Println("write error:", err) delete(r.clients, conn) close(conn) } } } } } func main() { r := Room{ clients: make(map[*websocket.Conn]bool), broadcast: make(chan Message), join: make(chan *websocket.Conn), leave: make(chan *websocket.Conn), } go r.start() http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Fatal("upgrade error:", err) } r.join <- conn defer func() { r.leave <- conn }() for { var message Message err = conn.ReadJSON(&message) if err != nil { log.Println("read error:", err) break } r.broadcast <- message } }) log.Fatal(http.ListenAndServe(":8080", nil)) }
在上述代码中,我们定义了一个Room
类型来管理连接的客户端。Room
类型内部包含了clients
用来保存所有已连接的客户端,broadcast
用来广播消息,join
和leave
用来处理客户端的连接和断开。
在main
函数中,我们创建了一个Room
实例,并通过go r.start()
启动Room
实例的消息处理协程。通过http.HandleFunc
函数和路由/ws
将WebSocket请求映射到匿名函数。在匿名函数中,我们将连接加入到Room
的join
通道中,并在函数末尾将连接从Room
的leave
通道中移除。同时,我们使用conn.ReadJSON
和conn.WriteJSON
3. Contoh bilik sembang masa nyata
rrreee
Dalam kod di atas, kami mentakrifkan jenis Bilik
secara dalaman mengandungi klien
untuk menyimpan semua klien yang disambungkan, siaran
untuk menyiarkan mesej dan menyertai
dan leave
digunakan untuk mengendalikan sambungan dan pemutusan sambungan klien.
utama
, kami mencipta contoh Bilik
dan memulakan Bilik
melalui go r.start()
kod>Coroutine pemprosesan mesej bagi contoh. Peta WebSocket meminta fungsi tanpa nama melalui fungsi <code>http.HandleFunc dan laluan /ws
. Dalam fungsi tanpa nama, kami menyertai sambungan ke saluran sertai
Room
dan pada penghujung fungsi kami meninggalkan sambungan dari Room
keluar
Dialih keluar daripada saluran. Pada masa yang sama, kami menggunakan conn.ReadJSON
dan conn.WriteJSON
untuk membaca dan menulis mesej masing-masing dalam format JSON. 🎜🎜Kesimpulan:🎜Artikel ini memberi panduan untuk membina aplikasi masa nyata berprestasi tinggi dengan memperkenalkan ciri-ciri protokol WebSocket dan cara menggunakannya di Golang. Dengan menyediakan contoh kod khusus, pembaca boleh dengan cepat memulakan pengaturcaraan Golang WebSocket dan menggunakan fungsi komunikasi masa nyata dalam projek. Harap artikel ini membantu anda! 🎜Atas ialah kandungan terperinci Panduan Pengaturcaraan WebSocket Golang: Membina aplikasi masa nyata berprestasi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!