Go 中接收 WebSocket 消息的方法取决于客户端和服务器端:客户端:使用 ReadMessage 函数读取消息,返回消息类型、负载和错误。服务器:读取连接客户端的 ReadMessage 方法,同样返回消息类型、负载和错误。
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中文网其他相关文章!