Contents

go第三方库-github.com.gorilla.websocket

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, "")
 |