首页  >  文章  >  后端开发  >  Go WebSocket 消息如何接收?

Go WebSocket 消息如何接收?

WBOY
WBOY原创
2024-06-02 14:47:57553浏览

Go 中接收 WebSocket 消息的方法取决于客户端和服务器端:客户端:使用 ReadMessage 函数读取消息,返回消息类型、负载和错误。服务器:读取连接客户端的 ReadMessage 方法,同样返回消息类型、负载和错误。

Go WebSocket 消息如何接收?

Go WebSocket 消息如何接收?

WebSocket 是一种全双工通信协议,允许客户端和服务器在建立单一连接后进行双向通信。本文将介绍如何在 Go 中接收 WebSocket 消息。

客户端接收消息

在客户端,可以通过 ReadMessage 函数接收消息:

import "github.com/gorilla/websocket"

type Message struct {
    Type int
    Payload []byte
}

func readMessage(conn *websocket.Conn) (*Message, error) {
    mt, r, err := conn.ReadMessage()
    if err != nil {
        return nil, err
    }

    return &Message{
        Type:    mt,
        Payload: r,
    }, nil
}

ReadMessage 函数返回三个值:消息类型 (mt)、消息负载 (r) 和一个错误 (err)。消息类型是一个整数值,表示消息的类型(文本、二进制等)。

服务器接收消息

在服务器端,可以通过客户端连接的 ReadMessage 方法接收消息:

func (c *Client) readMessage() (*Message, error) {
    mt, r, err := c.conn.ReadMessage()
    if err != nil {
        return nil, err
    }

    return &Message{
        Type:    mt,
        Payload: r,
    }, nil
}

实战案例

以下是一个接收 WebSocket 消息并将其输出到控制台的 Go 客户端示例:

package main

import (
    "fmt"
    "log"

    "github.com/gorilla/websocket"
)

func main() {
    conn, _, err := websocket.DefaultDialer.Dial("ws://example.com/ws", nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer conn.Close()

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway,
                websocket.CloseAbnormalClosure) {
                log.Fatal("unexpected close:", err)
            }
            continue
        }

        fmt.Printf("received: %s\n", message)
    }
}

同样的,以下是一个接收 WebSocket 消息并在数据库中存储它们的 Go 服务器示例:

package main

import (
    "database/sql"
    "fmt"
    "log"

    "github.com/gorilla/websocket"
)

func main() {
    // 数据库设置...

    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal("upgrade:", err)
    }
    defer conn.Close()

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway,
                websocket.CloseAbnormalClosure) {
                log.Fatal("unexpected close:", err)
            }
            continue
        }

        // 将消息保存到数据库...
    }
}

以上是Go WebSocket 消息如何接收?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn