
WebSocket是一種用於在網頁瀏覽器和伺服器之間進行即時雙向通訊的技術。它提供了一種可靠的方式來發送和接收數據,並且比傳統的HTTP請求-回應機制更有效率、更快速。在golang中,我們可以使用第三方函式庫來支援WebSocket通信,本文將介紹如何使用gorilla/websocket函式庫來實現WebSocket通信,並提供具體的程式碼範例。
- 安裝gorilla/websocket庫
使用go get指令可以輕鬆安裝gorilla/websocket函式庫:
1 | go get github.com/gorilla/websocket
|
登入後複製
- #建立WebSocket連線
在伺服器端,使用gorilla/websocket函式庫的Upgrader函數可以將HTTP連線升級為WebSocket連線。程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import (
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func myHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
for {
messageType, p, err := conn.ReadMessage()
if err != nil {
return
}
err = conn.WriteMessage(messageType, p)
if err != nil {
return
}
}
}
func main() {
http.HandleFunc( "/" , myHandler)
http.ListenAndServe( ":8080" , nil)
}
|
登入後複製
在客戶端,我們可以使用JavaScript程式碼來建立WebSocket連線。程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | var ws = new WebSocket( "ws://localhost:8080/" );
ws.onopen = function () {
console.log( "WebSocket连接已打开" );
};
ws.onmessage = function (evt) {
console.log( "接收到消息: " + evt.data);
};
ws.onclose = function () {
console.log( "WebSocket连接已关闭" );
};
|
登入後複製
- 傳送和接收訊息
在伺服器端,我們可以使用WriteMessage函數向客戶端傳送訊息。程式碼如下:
1 2 3 4 5 | err := conn.WriteMessage(websocket.TextMessage, []byte( "Hello, client!" ))
if err != nil {
return
}
|
登入後複製
在客戶端,我們可以使用send函數來傳送訊息,並且使用onmessage函數來接收訊息。程式碼如下:
1 2 3 4 5 | ws.send( "Hello, server!" );
ws.onmessage = function (evt) {
console.log( "接收到消息: " + evt.data);
};
|
登入後複製
- 處理WebSocket請求
在實際應用程式中,我們可能需要在處理WebSocket請求時進行認證和授權。在這種情況下,我們可以使用HTTP頭部來傳遞認證資訊。例如,可以在HTTP頭部中添加類似於以下資訊:
1 | Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
|
登入後複製
然後,在伺服器端,我們可以使用Upgrader函數的CheckOrigin選項來檢查WebSocket請求的來源,並且使用HTTP頭部中的認證資訊來處理請求。具體程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
if r.Header.Get( "Origin" ) != "http://localhost:8080" {
return false
}
if r.Header.Get( "Authorization" ) != "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" {
return false
}
return true
},
}
func myHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
for {
messageType, p, err := conn.ReadMessage()
if err != nil {
return
}
err = conn.WriteMessage(messageType, p)
if err != nil {
return
}
}
}
|
登入後複製
- 總結
本文介紹如何在golang中使用gorilla/websocket函式庫來實作WebSocket通信,並提供了具體的程式碼範例。透過WebSocket技術,我們可以建立高效、即時的雙向通訊應用程序,例如線上聊天室和多人遊戲等。在實際應用中,我們還需要考慮安全性和可靠性等問題,例如進行認證和授權、處理異常情況等。
以上是如何在golang中使用WebSocket進行跨平台通信的詳細內容。更多資訊請關注PHP中文網其他相關文章!