在Golang中使用GorillaWebSocket包

GoGorillaWebSocket教程展示了如何使用GorillaWebSocket包来处理websockets。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

WebSocket是一种计算机通信协议,通过单个TCP连接提供全双工通信通道。WebSockets用于高度交互的应用程序,例如游戏、聊天或股票市场。

GorillaWebSocket包提供了完整且经过测试的WebSocket协议实现。

$ go get github.com/gorilla/websocket

此命令安装包。

大猩猩WebSocket示例

在示例中,我们创建了一个简单的websocket服务器。客户端将是使用JS代码连接到服务器的浏览器。

package main

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

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func main() {

    http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) {
        conn, err := upgrader.Upgrade(w, r, nil)

        if err != nil {
            log.Fatal(err)
        }

        for {

            msgType, msg, err := conn.ReadMessage()
            if err != nil {
                return
            }

            fmt.Printf("%s sent: %s\n", conn.RemoteAddr(), string(msg))

            if err = conn.WriteMessage(msgType, msg); err != nil {
                return
            }
        }
    })

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        http.ServeFile(w, r, "index.html")
    })

    log.Println("Listening...")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

该程序设置了websocket端点和静态index.html页面。

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

我们为升级程序定义缓冲区。它指定将HTTP连接升级为WebSocket连接的参数。

http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) {

我们为/echo端点注册了一个处理函数。

conn, err := upgrader.Upgrade(w, r, nil)

我们将HTTP服务器连接升级为WebSocket协议。

for {

    msgType, msg, err := conn.ReadMessage()
    if err != nil {
        return
    }

    fmt.Printf("%s sent: %s\n", conn.RemoteAddr(), string(msg))

    if err = conn.WriteMessage(msgType, msg); err != nil {
        return
    }
}

我们持续监听通过该WebSocket连接发送的任何传入消息。我们使用ReadMessage从客户端读取消息。WriteMessage将消息写回客户端。

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, "index.html")
})

我们设置了静态HTML主页,我们从中连接到服务器。

到websocket端点的连接是从浏览器建立的。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <input id="input" type="text">
    <button onclick="send()">Send</button>
    <pre id="output"></pre>

    <script>
        var input = document.getElementById("input");
        var output = document.getElementById("output");
        var socket = new WebSocket("ws://localhost:8080/echo");

        socket.onopen = () => {
            output.innerHTML += "connected\n";
        };

        socket.onmessage = (e) => {
            output.innerHTML += `{e.data}\n`;
        };

        function send() {
            socket.send(input.value);
            input.value = "";
        }
    </script>
</body>

</html>

在JS中,我们使用WebSocket类提供API来创建和管理与服务器的WebSocket连接,以及在连接上发送和接收数据。

在本文中,我们使用GorillaWebSocket包处理websockets。

列出所有Go教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏