ZBLOG

golang websocket 服务端开启压缩如何写

在 Go 中,我们可以通过设置 http.Header 中的 "Sec-WebSocket-Extensions" 字段来开启 WebSocket 数据压缩。具体步骤如下:

  1. 导入相关包
  1. import (
  2. "compress/flate"
  3. "github.com/gorilla/websocket"
  4. "net/http"
  5. )
  1. 定义一个 http.HandlerFunc 处理函数,并在其中使用 websocket.Upgrader 升级 HTTP 连接为 WebSocket 连接。
  1. func websocketHandler(w http.ResponseWriter, r *http.Request) {
  2. upgrader := &websocket.Upgrader{
  3. ReadBufferSize: 1024,
  4. WriteBufferSize: 1024,
  5. CheckOrigin: func(r *http.Request) bool {
  6. return true
  7. },
  8. }
  9. conn, err := upgrader.Upgrade(w, r, nil)
  10. if err != nil {
  11. log.Println("upgrade:", err)
  12. return
  13. }
  14. defer conn.Close()
  15. // TODO: 处理 WebSocket 消息
  16. }
  1. 在升级连接时,设置 http.Header 中的 "Sec-WebSocket-Extensions" 字段,以开启数据压缩。压缩算法可以选择 "permessage-deflate""x-webkit-deflate-frame"
  1. extensions := []string{"permessage-deflate"}
  2. responseHeader := http.Header{}
  3. responseHeader.Set("Sec-WebSocket-Extensions", strings.Join(extensions, ", "))
  4. upgrader.Subprotocols = []string{"chat"}
  5. upgrader.EnableCompression = true
  6. conn, err := upgrader.Upgrade(w, r, responseHeader)
  7. if err != nil {
  8. // ...
  9. }

这样就开启了 WebSocket 数据压缩。在处理 WebSocket 消息时,可以通过 conn.EnableWriteCompression()conn.EnableReadCompression() 分别启用写入和读取的数据压缩。

  1. if err := conn.WriteMessage(websocket.TextMessage, []byte("Hello, World!")); err != nil {
  2. // ...
  3. }
  4. conn.EnableWriteCompression(true)
  5. if err := conn.WriteMessage(websocket.TextMessage, []byte("Hello, Compressed World!")); err != nil {
  6. // ...
  7. }
  8. conn.EnableReadCompression(true)
  9. _, message, err := conn.ReadMessage()
  10. if err != nil {
  11. // ...
  12. }
  13. log.Printf("received message: %s", message)

完整代码示例:

  1. package main
  2. import (
  3. "compress/flate"
  4. "github.com/gorilla/websocket"
  5. "log"
  6. "net/http"
  7. )
  8. func websocketHandler(w http.ResponseWriter, r *http.Request) {
  9. upgrader := &websocket.Upgrader{
  10. ReadBufferSize: 1024,
  11. WriteBufferSize: 1024,
  12. CheckOrigin: func(r *http.Request) bool {
  13. return true
  14. },
  15. }
  16. extensions := []string{"permessage-deflate"}
  17. responseHeader := http.Header{}
  18. responseHeader.Set("Sec-WebSocket-Extensions", strings.Join(extensions, ", "))
  19. upgrader.Subprotocols = []string{"chat"}
  20. upgrader.EnableCompression = true
  21. conn, err := upgrader.Upgrade(w, r, responseHeader)
  22. if err != nil {
  23. log.Println("upgrade:", err)
  24. return
  25. }
  26. defer conn.Close()
  27. conn.EnableWriteCompression(true)
  28. conn.EnableReadCompression(true)
  29. for {
  30. messageType, p, err := conn.ReadMessage()
  31. if err != nil {
  32. log.Println("read:", err)
  33. break
  34. }
  35. log.Printf("recv: %s", p)
  36. if err := conn.WriteMessage(messageType, p); err != nil {
  37. log.Println("write:", err)
  38. break
  39. }
  40. }
  41. }
  42. func main() {
  43. http.HandleFunc("/ws", websocketHandler)
  44. log.Fatal(http.ListenAndServe(":8080", nil))
  45. }

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?