要在Go语言中实现WebSocket功能,您可以使用标准库net/http
中的websocket
包或者第三方库如github.com/gorilla/websocket
或github.com/gobwas/ws
。以下是一个使用标准库net/http
的WebSocket简单示例,展示如何创建一个WebSocket服务器以及如何处理客户端连接和消息收发:
1. 安装依赖(仅适用于第三方库) 如果使用第三方库,如github.com/gorilla/websocket
,请先安装:
bash
go get github.com/gorilla/websocket
2. 创建WebSocket服务器
使用标准库net/http
实现WebSocket服务器:
go
package main
import (
"log"
"net/http"
"time"
"github.com/gorilla/websocket" // 若使用第三方库gorilla/websocket,取消注释并引入此行
)
var upgrader = websocket.Upgrader{} // 使用gorilla/websocket时使用此行
func serveWS(w http.ResponseWriter, r *http.Request) {
// 使用标准库net/http
c, err := (&websocket.Upgrader{}).Upgrade(w, r, nil) // 使用标准库时使用此行
// 使用gorilla/websocket库
// c, err := upgrader.Upgrade(w, r, nil) // 使用gorilla/websocket时使用此行
if err != nil {
log.Println("Upgrade:", err)
return
}
defer c.Close()
for {
// Read message from client
mt, message, err := c.ReadMessage()
if err != nil {
log.Println("Read:", err)
break
}
log.Printf("Received: %s", message)
// Send a reply back to client
err = c.WriteMessage(mt, []byte("Hello, you said: "+string(message)))
if err != nil {
log.Println("Write:", err)
break
}
// Optionally introduce a delay or other processing before sending the reply
time.Sleep(1 * time.Second)
}
}
func main() {
http.HandleFunc("/ws", serveWS)
log.Println("Listening on :8080...")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe:", err)
}
}
示例说明:
serveWS
函数作为HTTP处理器,被注册到"/ws"路由上。- 当客户端发起WebSocket连接请求时,
(&websocket.Upgrader{}).Upgrade()
函数将HTTP连接升级为WebSocket连接。 - 在升级成功后,服务器进入一个无限循环,持续读取客户端发送的消息(
c.ReadMessage()
)。 - 每次收到消息后,服务器将消息内容打印到日志,并发送一条回复消息给客户端(
c.WriteMessage()
),回复消息包含客户端发送的内容前缀加上固定的文本。 - 如果在读取或写入消息过程中发生错误,服务器将断开连接并退出循环。
如果您选择使用第三方库如github.com/gobwas/ws
或有其他特定需求(如心跳检测、并发管理、消息分发等),对应的实现细节会有所不同,但基本的连接升级、消息读写逻辑是相似的。请查阅所选库的官方文档以获取更详细的使用指南和示例代码。