go:webSocket连接

85 阅读2分钟

库的选择-gorilla/websocket

Go语言有多个用于WebSocket连接的库,以下是其中一些比较受欢迎和常用的库及其简要介绍:

  1. gorilla/websocket
    • GitHub: github.com/gorilla/web…
    • 介绍: Gorilla WebSocket是Go的WebSocket库,它提供了一个完整、高效和简单易用的WebSocket的实现。它遵循WebSocket RFC 6455标准,并支持跨域连接、同源策略检查等。此库是Gorilla工具包中的一个组件,但也可以单独使用。
    • 特点:
      • 低级别的API访问,允许自定义行为。
      • 支持连接的拨号和升级。
      • 有助于防止CRLF注入、空闲连接等常见的WebSocket安全问题。
  1. gobwas/ws
    • GitHub: github.com/gobwas/ws
    • 介绍: 这是一个为性能而设计的WebSocket库,它提供了低级别的API访问,允许开发者有更多的自定义选项。
    • 特点:
      • 高性能,低内存分配。
      • 为WebSocket扩展提供支持。
      • 与net/http包兼容,但也可以独立使用。
  1. nhooyr.io/websocket
    • GitHub: github.com/nhooyr/webs…
    • 介绍: 这是一个最小化的WebSocket库,与net/http包完全兼容,提供了简洁的API和现代的Go特性。
    • 特点:
      • 支持WebSocket ping/pong。
      • 支持上下文(context)取消和超时。
      • 提供了连接的拨号和升级功能。

以上就是Go语言中一些受欢迎的WebSocket库。在选择库时,您应该根据项目的具体需求、库的活跃度和维护情况来做决策。对于大多数应用,gorilla/websocket和nhooyr.io/websocket都是非常好的选择。

示例

使用 gorilla/websocket 进行WebSocket连接的主要步骤如下:

  1. 安装库:你可以使用 go get 命令来安装。
  2. 创建WebSocket的服务器端和客户端。

以下是如何使用 gorilla/websocket 进行WebSocket连接的代码示例:

1. 安装 gorilla/websocket

go get -u github.com/gorilla/websocket

2. WebSocket 服务器端示例

package main

import (
    "fmt"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true  // 允许任何Origin跨站访问
    },
}

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)  // 升级普通HTTP连接为WebSocket
    if err != nil {
        fmt.Println("Error during connection upgradation:", err)
        return
    }
    defer conn.Close()

    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            fmt.Println("Error during message reading:", err)
            break
        }
        if err := conn.WriteMessage(messageType, p); err != nil {
            fmt.Println("Error during message writing:", err)
            break
        }
    }
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

3. WebSocket 客户端示例

package main

import (
    "fmt"
    "github.com/gorilla/websocket"
)

func main() {
    // 连接服务器
    conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080", nil)
    if err != nil {
        panic("Cannot connect: " + err.Error())
    }
    defer conn.Close()

    // 发送消息
    err = conn.WriteMessage(websocket.TextMessage, []byte("Hello, Server!"))
    if err != nil {
        panic("Write error: " + err.Error())
    }

    // 接收消息
    _, message, err := conn.ReadMessage()
    if err != nil {
        panic("Read error: " + err.Error())
    }
    fmt.Println("Received message:", string(message))
}

在上述示例中,服务器监听 8080 端口并接受WebSocket连接请求。当连接建立后,服务器会读取客户端发送的每一条消息并立即将其返回。而客户端则连接到服务器,发送一条消息,并打印从服务器接收到的消息。

这只是一个基本示例。在实际应用中,您可能需要处理更多的边界情况、错误、并可能需要进行更多的配置。