ZBLOG

golang 的 websocket 返回如下错误 websocket: application specific 'Sec-WebSocket-Extensions' headers are unsupported

这个错误通常是由于在使用 websocket 时,客户端发送了带有自定义的 Sec-WebSocket-Extensions 头信息,而服务器不支持这些头信息所导致的。

解决此问题的方法是在客户端和服务器之间协商一个受双方支持的协议并且不包括任何自定义的扩展头。您可以通过以下代码示例来实现:

  1. import (
  2. "net/url"
  3. "github.com/gorilla/websocket"
  4. )
  5. // 客户端连接服务器
  6. func Connect() (*websocket.Conn, error) {
  7. u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
  8. // 设置头信息
  9. header := http.Header{}
  10. header.Set("Sec-WebSocket-Protocol", "chat")
  11. // 建立连接
  12. conn, _, err := websocket.DefaultDialer.Dial(u.String(), header)
  13. if err != nil {
  14. return nil, err
  15. }
  16. return conn, nil
  17. }
  18. // 服务端处理连接请求
  19. func HandleConnection(w http.ResponseWriter, r *http.Request) {
  20. // 在 Upgrade 时加入协商头信息
  21. upgrader := websocket.Upgrader{
  22. ReadBufferSize: 1024,
  23. WriteBufferSize: 1024,
  24. CheckOrigin: func(r *http.Request) bool { return true },
  25. Subprotocols: []string{"chat"}, // 支持的子协议类型
  26. }
  27. // 升级连接
  28. conn, err := upgrader.Upgrade(w, r, nil)
  29. if err != nil {
  30. log.Println(err)
  31. return
  32. }
  33. // 处理消息
  34. for {
  35. messageType, p, err := conn.ReadMessage()
  36. if err != nil {
  37. log.Println(err)
  38. return
  39. }
  40. // 处理数据
  41. handleData(conn, messageType, p)
  42. }
  43. }

在客户端建立连接时,通过设置 Sec-WebSocket-Protocol 头信息来协商子协议类型。在服务器处理连接请求时,通过设置 Upgrader 的 Subprotocols 字段来指定支持的子协议类型。这样就可以避免出现 “Sec-WebSocket-Extensions” headers are unsupported 错误。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1132

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?