首頁  >  文章  >  後端開發  >  golang搭建websocket

golang搭建websocket

WBOY
WBOY原創
2023-05-22 19:21:071742瀏覽

Golang是一種快速編譯、有效率、安全的程式語言,在網路開發方面也有廣泛的應用。其中,使用Golang搭建Websocket是一個非常流行的應用場景。本文將介紹如何使用Golang建構一個Websocket應用程式。

一、什麼是Websocket

Websocket是一種協議,它允許在瀏覽器和伺服器之間建立雙向通訊的連線。傳統的HTTP協定只能由瀏覽器向伺服器發出請求,並接收伺服器回應。但是,使用Websocket可以讓伺服器主動向瀏覽器發送訊息,實現了伺服器與瀏覽器的全雙工通訊。

二、Golang如何實作Websocket

Golang自帶了一個標準函式庫net/http,這個套件提供了一個http.Server結構體,它可以用來建構Web伺服器。除此之外,net/http也提供了一個websocket子包,它為我們提供了建構WebSocket伺服器所需的全部功能。

  1. 建立WebSocket連接

要建立WebSocket連接,客戶端需要向伺服器發送一個HTTP請求,並攜帶Upgrade頭部,指示請求升級為WebSocket協定。伺服器端在收到此請求後,需要檢查Upgrade頭部,並根據是否為WebSocket請求來進行相應的處理。

伺服器端可以使用websocket.IsWebSocketUpgrade函數來檢查請求是否為WebSocket請求,並使用websocket.Upgrade函數升級請求。升級成功後,伺服器就可以透過*websocket.Conn類型的連線物件與客戶端進行通訊了。

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()
    // 使用conn进行通信
}

其中,upgrader是一個websocket.Upgrader類型的變量,透過設定它的屬性可以控制WebSocket連線的處理方式。 Upgrade函數在升級請求時會阻塞,因此要將其放在goroutine中運行。

  1. 傳送和接收WebSocket訊息

一旦WebSocket連線建立成功,客戶端和伺服器都可以透過*websocket.Conn物件進行通訊。使用這個物件可以發送和接收WebSocket訊息。

傳送訊息很簡單,只需要呼叫WriteMessage方法:

err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))

接收訊息的方法有三種:

  • ReadMessage:阻塞讀取,直到有訊息到來
  • NextReader:阻塞等待下一個訊息到來
  • NextWriter:傳回一個io.WriteCloser對象,可以使用這個對象發送訊息

一般使用ReadMessage方法接收WebSocket訊息:

_, message, err := conn.ReadMessage()
if err != nil {
    log.Println(err)
    return
}
log.Printf("recv: %s", message)

三、一個簡單的WebSocket應用程式

在這個範例中,我們將建立一個簡單的聊天室應用程式,客戶端發送訊息之後,伺服器將訊息廣播給所有連接的客戶端。

客戶端程式碼:(使用JavaScript)

<!DOCTYPE html>
<html>
<head>
    <title>Chatroom</title>
</head>
<body>
    <input type="text" id="input-message"/>
    <button onclick="sendMessage()">发送</button>
    <ul id="message-list"></ul>

    <script>
        var ws = new WebSocket("ws://localhost:8080/ws");
        ws.onmessage = function(event) {
            var message = event.data;
            var li = document.createElement("li");
            li.appendChild(document.createTextNode(message));
            document.getElementById("message-list").appendChild(li);
        };

        function sendMessage() {
            var message = document.getElementById("input-message").value;
            ws.send(message);
        }
    </script>
</body>
</html>

伺服器端程式碼:

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{}

func main() {
    http.HandleFunc("/ws", wsHandler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            break
        }
        fmt.Printf("recv: %s
", message)

        // 广播给所有客户端
        for _, conn := range conns {
            err := conn.WriteMessage(websocket.TextMessage, message)
            if err != nil {
                log.Println(err)
                break
            }
        }
    }
}

在上面的程式碼中,我們將所有連接的websocket.Conn物件儲存在conns變數中。每當有一個新訊息​​到來時,伺服器會將訊息廣播給所有客戶端。

總結

使用Golang建立WebSocket應用程式非常簡單,只需要匯入net/httpwebsocket套件即可,直接使用標準庫提供的API即可完成WebSocket應用程式的開發。希望此文章能夠對Golang Websocket開發有所幫助。

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn