• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Go如何实现Websocket服务以及代理

    发布者: 嘉6148 | 发布时间: 2025-8-14 13:04| 查看数: 16| 评论数: 0|帖子模式

    握手阶段采用 HTTP 协议,能通过各种 HTTP 代理服务器
    数据格式比较轻量,性能开销小,通信高效
    可以发送文本和二进制数据
    没有浏览器的同源限制
    </ol>websocket 的典型场景:

    • 即时通信
    • 协同编辑/编辑
    • 实时数据流的拉取与推送
    <a name="_lab2_0_1">
    2. WebSocket 推送和浏览器轮询

    在 B/S 开发领域,若需要浏览器 B 即时得到服务器的状态更新,常使用两个方案:

    • 浏览器端轮询
    • 服务器端推送
    浏览器轮询:浏览器端,当需要获取最新数据状态时,利用脚本程序循环向服务端发送请求。
    服务器推送,服务器端,当状态改变时,将数据发送到浏览器端。

    HTTP/2 版本也支持服务器端推送,但实现上以推送静态资源为主,不能基于业务逻辑推送特定的消息,因此当前的普及使用率 websocket 还是主流。

    3. WebSocket 和 http

    相同点

    • 应用层协议
    • B/S 架构中使用
    • 基于 TCP 协议
    • 端口默认都是:80 和 443
    不同点


    4. WebSocket 握手过程

    通过 HTTP 请求响应,中的头信息,完成 websocket 握手,如图:


    • 在请求头中添加如下信息
    1. WebSocket 是一种应用层协议
    复制代码
    基于以上请求头,服务器端,就知道需要将协议升级为 websocket 协议,并提供一些验证信息。

    • 服务端的响应头
    1. ws://host:port/path/querywss://host:port/path/query
    复制代码
    基于以上响应头,浏览器端就知道服务器端升级成功,并通过了验证。
    至此,B/S 端可以基于该连接,完成 websocket 双向通信了。
    websocket 只能发送 GET 请求

    5. WebSocket 状态码和消息类型


    5.1 状态码

    WebSocket协议状态码解析

    5.2 消息类型

    TextMessageBinaryMessage 分别表示发送文本消息和二级制消息
    CloseMessage 关闭帧,接收方收到这个消息就关闭连接
    PingMessagePongMessage : 是保持心跳的帧

    • 发送方 -> 接收方是 PingMessage
    • 接收方 -> 发送方是 PongMessage
    1. # 升级为 websocket
    2. Upgrade: websocket
    3. Connection: Upgrade
    4. # 一个 Base64 encode 的值,有于验证服务器端是否支持websocket
    5. Sec-WebSocket-Key: x4JJHMbDL22zLk1GBhXDw==
    6. # 用户协议,可以视为不同业务逻辑的频道
    7. Sec-WebSocket-Protocol: chat
    8. # 协议版本,13是当前通用版本,几乎不需要更改
    9. Sec-WebSocket-Version: 13
    复制代码
    6. WebSocket 服务器实现

    使用 github.com/gorilla/websocket 这个库函数
    1. HTTP/1.1 101 Switching Protocols
    2. # 协议升级
    3. Upgrade: websocket
    4. # 连接状态
    5. Connection: Upgrade
    6. # WebSocket服务端根据Sec-WebSocket-Key生成
    7. Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
    8. # WebSocket协议用户协议
    9. Sec-WebSocket-Protocol: chat
    复制代码
    使用 Apifox 测试 websocket 是否能连接并且发送消息
    消息发送成功,同时也接收到来服务端的消息

    消息接收成功


    7. WebSocket 代理实现
    1. 由服务器发 ping 给浏览器,浏览器返回 pong 消息
    复制代码


    8. WebSocket 服务端主动推送功能的实现
    1. func WebSocketServer() {
    2.         addr := "localhost:8002"
    3.         http.HandleFunc("/wshandler", WebSocketUpgrade)
    4.         log.Println("Starting websocket server at " + addr)

    5.         go func() {
    6.                 err := http.ListenAndServe(addr, nil)
    7.                 if err != nil {
    8.                         log.Fatal(err)
    9.                 }
    10.         }()

    11.         log.Println("WebSocket 服务器正在运行。按Ctrl+C退出")
    12.         select {}
    13. }

    14. func WebSocketUpgrade(resp http.ResponseWriter, req *http.Request) {
    15.         // 初始化 Upgrader
    16.         upgrader := websocket.Upgrader{} // 使用默认的选项
    17.         // 第三个参数是响应头,默认会初始化
    18.         conn, err := upgrader.Upgrade(resp, req, nil)
    19.         if err != nil {
    20.                 log.Println(err)
    21.                 return
    22.         }
    23.         defer conn.Close()

    24.         // 读取客户端的发送额消息,并返回
    25.         go ReadMessage(conn)
    26.         select {}
    27. }

    28. // 读取客户端发送的消息,并返回
    29. func ReadMessage(conn *websocket.Conn) {
    30.         for {
    31.                 // 消息类型:文本消息和二进制消息
    32.                 messageType, msg, err := conn.ReadMessage()
    33.                 if err != nil {
    34.                         log.Println(err)
    35.                         return
    36.                 }
    37.                 fmt.Println("receive msg:", string(msg))

    38.                 err = conn.WriteMessage(messageType, msg)
    39.                 if err != nil {
    40.                         log.Println("write error:", err)
    41.                         return
    42.                 }
    43.         }
    44. }
    复制代码
    每隔三秒可以看到服务推送过来的消息


    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表