在 Go 语言中,你可以使用标准库中的 net/http 包和第三方库 gorilla/websocket 来实现一个 WebSocket 服务器。gorilla/websocket 库提供了对 WebSocket 协议的高级抽象,使得处理 WebSocket 连接变得相对简单。
Go
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
// 允许跨域请求,生产环境中请谨慎使用
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func handler(w http.ResponseWriter, r *http.Request) {
// 升级 HTTP 请求到 WebSocket 连接
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Error upgrading to WebSocket:", err)
return
}
defer ws.Close()
fmt.Println("Client connected")
// 读取来自客户端的消息
for {
// 读取 WebSocket 连接的消息
messageType, p, err := ws.ReadMessage()
if err != nil {
log.Println("Error reading message:", err)
break
}
fmt.Printf("Received message: %s of type %d\n", p, messageType)
// 发送消息回客户端
err = ws.WriteMessage(messageType, p)
if err != nil {
log.Println("Error writing message:", err)
break
}
}
fmt.Println("Client disconnected")
}
func main() {
http.HandleFunc("/ws", handler)
// 启动 HTTP 服务器
fmt.Println("Starting server on ws://localhost:8080/ws")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}