首頁 > 後端開發 > Golang > golang實作websocket

golang實作websocket

王林
發布: 2023-05-22 14:45:08
原創
2441 人瀏覽過

隨著網路科技的不斷發展,即時連線成為了越來越多應用的必備功能。 WebSocket 是一種基於 TCP 協議的網路協議,它允許伺服器向客戶端推送數據,實現即時雙向通訊。

Go 是一門快速且有效率的程式語言,由於其簡潔、高效等特點,成為了近年來非常流行的語言之一。在本文中,我們將介紹如何使用 Go 語言實作 WebSocket 服務。

什麼是 WebSocket

WebSocket 協定是一種基於TCP協定的全雙工通訊協議,允許客戶端和伺服器之間進行即時通訊。相對於傳統的 HTTP 請求和回應模式,WebSocket 可以在連線建立後一直保持連線狀態,從而實現即時的雙向通訊。

WebSocket 協定的工作流程如下:

  1. 客戶端發起 WebSocket 連線請求。
  2. 伺服器收到請求後進行握手協議,確認可以使用 WebSocket 連線。
  3. WebSocket 連線建立後,客戶端和伺服器可以進行即時雙向通訊。
  4. 如果伺服器需要向客戶端發送數據,可以直接向客戶端發送,反之亦然。

相比於傳統的HTTP請求,WebSocket的優點在於:

  1. 即時雙向通信,適用於線上遊戲、即時聊天、線上視訊等即時性強的應用場景。
  2. 更少的請求和回應次數,減少網路頻寬的消耗,提高資料傳輸效率。

Go 實現 WebSocket

Go 是一門新興的語言,由於其簡潔、高效、安全等特點,越來越多的團隊開始使用 Go 來開發網路應用程式。在 Go 中,有一個標準函式庫 net/http,提供了實作 HTTP 和 WebSocket 服務的 API。

建立WebSocket 連接

要建立WebSocket 連接,我們需要在服務端和客戶端分別進行如下操作:

服務端

  1. 建立HTTP 服務,使用http.HandleFunc 函數註冊一個路由器,並允許對應的路由處理函數進行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")
})
登入後複製
  1. 在 WebSocket 通訊處理函數中進行建立連線作業。
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
        }
    }
}
登入後複製

客戶端

在客戶端中,我們需要使用 JavaScript 程式碼進行 WebSocket 連線的操作。具體程式碼如下:

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);
};
登入後複製

發送訊息

當 WebSocket 連線建立後,服務端和用戶端就可以進行即時雙向通訊了。服務端可以透過 conn.WriteMessage 函數向客戶端發送訊息,客戶端可以透過 socket.send 函數向服務端發送訊息。

從客戶端發送訊息:

socket.send("Hello world");
登入後複製

在服務端接收並處理訊息:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}

log.Printf("Received: %s
", msg)
登入後複製

從服務端發送訊息:

err = conn.WriteMessage(websocket.TextMessage, []byte("Hello world"))
if err != nil {
    log.Println("Write error:", err)
    return
}
登入後複製

在客戶端接收並處理訊息:

socket.onmessage = function(event) {
    console.log("Received: " + event.data);
};
登入後複製

WebSocket 的錯誤處理

在實際開發中,WebSocket 可能會出現各種異常情況,例如網路中斷、連線逾時、伺服器崩潰等。在 Go 中,我們可以透過錯誤處理來處理這些異常情況。

在服務端中,我們可以透過 defer 語句來進行資源釋放,例如關閉 WebSocket 連線等。

defer conn.Close()
登入後複製

同時,在進行 websocket 通訊處理函數的過程中,我們需要對可能發生的錯誤進行預處理。例如:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}
登入後複製

在客戶端中,我們可以透過onerror 事件來處理WebSocket 的錯誤,例如:

socket.onerror = function(event) {
    console.log("WebSocket error: " + event.data);
};
登入後複製

總結

#本文介紹了如何使用Go 語言實作WebSocket 服務,包括建立WebSocket 連線、傳送訊息、異常處理等面向。 WebSocket 協定提供了一種即時雙向通訊的方法,可用於線上遊戲、即時聊天、線上視訊等即時性強的應用場景。在 Go 中,使用標準函式庫 net/http 提供的 API,可以非常方便地實作 WebSocket 服務。

以上是golang實作websocket的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板