Dengan pembangunan berterusan teknologi Internet, sambungan masa nyata telah menjadi fungsi penting untuk lebih banyak aplikasi. WebSocket ialah protokol rangkaian berdasarkan protokol TCP yang membolehkan pelayan menolak data kepada klien untuk mencapai komunikasi dua hala masa nyata.
Go ialah bahasa pengaturcaraan yang pantas dan cekap Disebabkan kesederhanaan dan kecekapannya, ia telah menjadi salah satu bahasa yang paling popular sejak beberapa tahun kebelakangan ini. Dalam artikel ini, kami akan memperkenalkan cara melaksanakan perkhidmatan WebSocket menggunakan bahasa Go.
Protokol WebSocket ialah protokol komunikasi dupleks penuh berdasarkan protokol TCP yang membenarkan komunikasi masa nyata antara klien dan pelayan. Berbanding dengan permintaan HTTP tradisional dan mod tindak balas, WebSocket boleh mengekalkan keadaan sambungan selepas sambungan diwujudkan, dengan itu mencapai komunikasi dua hala masa nyata.
Aliran kerja protokol WebSocket adalah seperti berikut:
Berbanding dengan permintaan HTTP tradisional, kelebihan WebSocket ialah:
Go ialah bahasa yang sedang berkembang pesat, disebabkan kesederhanaan, kecekapan, keselamatan dan ciri-ciri lain, semakin ramai pasukan mula menggunakan Go untuk membangunkan aplikasi rangkaian. Dalam Go, terdapat net/http perpustakaan standard yang menyediakan API untuk melaksanakan perkhidmatan HTTP dan WebSocket.
Untuk mewujudkan sambungan WebSocket, kami perlu melaksanakan operasi berikut pada pelayan dan klien masing-masing:
http.HandleFunc
untuk mendaftarkan penghala dan benarkan fungsi pemprosesan penghalaan yang sepadan untuk melaksanakan komunikasi WebSocket. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 判断是否支持 WebSocket,如果支持则进入 WebSocket 通信处理函数。 if websocket.IsWebSocketUpgrade(r) { websocket.Handler(handleWebSocket).ServeHTTP(w, r) return } http.ServeFile(w, r, "index.html") })
func handleWebSocket(conn *websocket.Conn) { defer conn.Close() // 输出日志信息,表示已经建立连接。 log.Println("WebSocket connected") for { // 读取客户端发送过来的消息。 _, msg, err := conn.ReadMessage() if err != nil { log.Println("Read error:", err) return } // 输出日志信息,表示接收到客户端发送的消息。 log.Printf("Received: %s ", msg) // 处理完毕后,发送消息。 err = conn.WriteMessage(websocket.TextMessage, msg) if err != nil { log.Println("Write error:", err) return } } }
Dalam klien, kami perlu menggunakan kod JavaScript untuk mengendalikan sambungan WebSocket. Kod khusus adalah seperti berikut:
var socket = new WebSocket("ws://127.0.0.1:8080/"); socket.onopen = function() { console.log("WebSocket connected"); }; socket.onmessage = function(event) { console.log("Received: " + event.data); }; socket.onclose = function(event) { console.log("WebSocket closed"); }; socket.onerror = function(event) { console.log("WebSocket error: " + event.data); };
Apabila sambungan WebSocket diwujudkan, pelayan dan pelanggan boleh menjalankan komunikasi dua hala masa nyata. Pelayan boleh menghantar mesej kepada klien melalui fungsi conn.WriteMessage
dan klien boleh menghantar mesej kepada pelayan melalui fungsi socket.send
.
Hantar mesej daripada pelanggan:
socket.send("Hello world");
Terima dan proses mesej pada pelayan:
_, msg, err := conn.ReadMessage() if err != nil { log.Println("Read error:", err) return } log.Printf("Received: %s ", msg)
Hantar mesej daripada pelayan:
err = conn.WriteMessage(websocket.TextMessage, []byte("Hello world")) if err != nil { log.Println("Write error:", err) return }
Pada klien Terima dan proses mesej:
socket.onmessage = function(event) { console.log("Received: " + event.data); };
Dalam pembangunan sebenar, WebSocket mungkin menghadapi pelbagai situasi tidak normal, seperti gangguan rangkaian, tamat masa sambungan, ranap pelayan, dsb. Dalam Go, kami boleh mengendalikan pengecualian ini melalui pengendalian ralat.
Di bahagian pelayan, kita boleh menggunakan pernyataan defer
untuk mengeluarkan sumber, seperti menutup sambungan WebSocket, dsb.
defer conn.Close()
Pada masa yang sama, semasa proses fungsi pemprosesan komunikasi soket web, kita perlu melakukan praproses ralat yang mungkin berlaku. Contohnya:
_, msg, err := conn.ReadMessage() if err != nil { log.Println("Read error:", err) return }
Dalam klien, kami boleh mengendalikan ralat WebSocket melalui acara onerror
, contohnya:
socket.onerror = function(event) { console.log("WebSocket error: " + event.data); };
Artikel ini memperkenalkan cara menggunakan Bahasa Go Laksanakan perkhidmatan WebSocket, termasuk mewujudkan sambungan WebSocket, menghantar mesej, pengendalian pengecualian, dsb. Protokol WebSocket menyediakan kaedah komunikasi dua hala masa nyata dan boleh digunakan dalam senario aplikasi masa nyata seperti permainan dalam talian, sembang masa nyata dan video dalam talian. Dalam Go, perkhidmatan WebSocket boleh dilaksanakan dengan mudah menggunakan API yang disediakan oleh perpustakaan standard net/http.
Atas ialah kandungan terperinci Golang melaksanakan websocket. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!