godoc
gorilla godoc 官方文档
nhooyr github官网
nhooyr godoc 官方文档
gorilla
该库已经不被维护
升级http协议
1
2
3
4
5
6
7
8
9
10
11
12
13
|
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func handler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
... Use conn to send and receive messages.
}
|
读取和写入
1
2
3
4
5
6
7
8
9
10
11
|
for {
messageType, p, err := conn.ReadMessage()
if err != nil {
log.Println(err)
return
}
if err := conn.WriteMessage(messageType, p); err != nil {
log.Println(err)
return
}
}
|
数据消息
WebSocket 协议区分文本和二进制数据消息。TextMessage 和 BinaryMessage 整数常量来标识两种数据消息类型。
ReadMessage 和 NextReader 方法返回接收到的消息的类型。WriteMessage 和 NextWriter 方法的 messageType 参数指定发送消息的类型。
控制消息
三种类型的控制消息:close、ping 和 pong。WriteControl、WriteMessage 或 NextWriter 方法向对等方发送控制消息。
SetPingHandler 方法设置的处理程序函数来处理接收到的 ping 消息。默认的 ping 处理程序向对等方发送一条 pong 消息。
SetPongHandler 方法设置的处理函数来处理接收到的 pong 消息。默认的 pong 处理程序什么都不做。
nhooyr
服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
c, err := websocket.Accept(w, r, nil)
if err != nil {
// ...
}
defer c.Close(websocket.StatusInternalError, "the sky is falling")
ctx, cancel := context.WithTimeout(r.Context(), time.Second*10)
defer cancel()
var v interface{}
err = wsjson.Read(ctx, c, &v)
if err != nil {
// ...
}
log.Printf("received: %v", v)
c.Close(websocket.StatusNormalClosure, "")
})
|
客户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
c, _, err := websocket.Dial(ctx, "ws://localhost:8080", nil)
if err != nil {
// ...
}
defer c.Close(websocket.StatusInternalError, "the sky is falling")
err = wsjson.Write(ctx, c, "hi")
if err != nil {
// ...
}
c.Close(websocket.StatusNormalClosure, "")
|