这个错误通常是由于在使用 websocket 时,客户端发送了带有自定义的 Sec-WebSocket-Extensions 头信息,而服务器不支持这些头信息所导致的。
解决此问题的方法是在客户端和服务器之间协商一个受双方支持的协议并且不包括任何自定义的扩展头。您可以通过以下代码示例来实现:
import (
"net/url"
"github.com/gorilla/websocket"
)
// 客户端连接服务器
func Connect() (*websocket.Conn, error) {
u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
// 设置头信息
header := http.Header{}
header.Set("Sec-WebSocket-Protocol", "chat")
// 建立连接
conn, _, err := websocket.DefaultDialer.Dial(u.String(), header)
if err != nil {
return nil, err
}
return conn, nil
}
// 服务端处理连接请求
func HandleConnection(w http.ResponseWriter, r *http.Request) {
// 在 Upgrade 时加入协商头信息
upgrader := websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool { return true },
Subprotocols: []string{"chat"}, // 支持的子协议类型
}
// 升级连接
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
// 处理消息
for {
messageType, p, err := conn.ReadMessage()
if err != nil {
log.Println(err)
return
}
// 处理数据
handleData(conn, messageType, p)
}
}
在客户端建立连接时,通过设置 Sec-WebSocket-Protocol 头信息来协商子协议类型。在服务器处理连接请求时,通过设置 Upgrader 的 Subprotocols 字段来指定支持的子协议类型。这样就可以避免出现 “Sec-WebSocket-Extensions” headers are unsupported 错误。