前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为开源项目 go-gin-api 增加 WebSocket 模块

为开源项目 go-gin-api 增加 WebSocket 模块

作者头像
新亮
发布2021-09-29 15:17:28
1.1K0
发布2021-09-29 15:17:28
举报
文章被收录于专栏:新亮笔记

文章目录:

  • WebSocket 示例界面
  • 第三方包
  • 代码封装
  • 小结
  • 推荐阅读

WebSocket 示例界面

第三方包

  • gorilla/websocket[1]

websocket 链接时支持配置项:

代码语言:javascript
复制
type Upgrader struct {
    // 指定升级 websocket 握手完成的超时时间
    HandshakeTimeout time.Duration

    // 指定 io 操作的缓存大小,如果不指定就会自动分配。
    ReadBufferSize, WriteBufferSize int

    // 写数据操作的缓存池,如果没有设置值,write buffers 将会分配到链接生命周期里。
    WriteBufferPool BufferPool

    //按顺序指定服务支持的协议,如值存在,则服务会从第一个开始匹配客户端的协议。
    Subprotocols []string

    // 指定 http 的错误响应函数,如果没有设置 Error 则,会生成 http.Error 的错误响应。
    Error func(w http.ResponseWriter, r *http.Request, status int, reason error)

    // 请求检查函数,用于统一的链接检查,以防止跨站点请求伪造。如果不检查,就设置一个返回值为 true 的函数。
    // 如果请求 Origin 标头可以接受,CheckOrigin 将返回 true。 如果 CheckOrigin 为nil,则使用安全默认值:如果 Origin 请求头存在且原始主机不等于请求主机头,则返回 false
    CheckOrigin func(r *http.Request) bool

    // EnableCompression 指定服务器是否应尝试协商每个邮件压缩(RFC 7692)。 
    // 将此值设置为true并不能保证将支持压缩。 
    // 目前仅支持“无上下文接管”模式
    EnableCompression bool
}

Upgrade 函数可将 http 升级到 WebSocket 协议:

代码语言:javascript
复制
// responseHeader 包含在对客户端升级请求的响应中。 
// 使用 responseHeader 指定 cookie(Set-Cookie)和应用程序协商的子协议(Sec-WebSocket-Protocol)。
// 如果升级失败,则升级将使用 HTTP 错误响应回复客户端
// 返回一个 Conn 指针,拿到他后,可使用 Conn 读写数据与客户端通信。
func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header) (*Conn, error)

代码封装

封装一个 socket_server,同时支持使用日志、数据库、缓存等操作:

代码语言:javascript
复制
type Server interface {

 // OnMessage 接收消息
 OnMessage()

 // OnSend 发送消息
 OnSend(message []byte) error

 // OnClose 关闭
 OnClose()
}

func New(logger *zap.Logger, db db.Repo, cache cache.Repo, conn *websocket.Conn) (Server, error) {
    
    ...
    
}

封装一个 socket_conn

代码语言:javascript
复制
func (h *handler) Connect() core.HandlerFunc {
 var upGrader = websocket.Upgrader{
  HandshakeTimeout: 5 * time.Second,
  CheckOrigin: func(r *http.Request) bool {
   return true
  },
 }

 return func(ctx core.Context) {
  ws, err := upGrader.Upgrade(ctx.ResponseWriter(), ctx.Request(), nil)
  if err != nil {
   return
  }

  server, err = socket_server.New(h.logger, h.db, h.cache, ws)
  if err != nil {
   return
  }

  go server.OnMessage()
 }
}

socket_conn 是一个 HandlerFunc,可直接在路由中使用。

项目中 websocket 链接地址为:/socket/system/message,发送消息的接口为:/api/tool/send_message

JavaScript 示例代码:

代码语言:javascript
复制
const ws = new WebSocket("ws://127.0.0.1:9999/socket/system/message");

//连接打开时触发
ws.onopen = function (evt) {
    ...
};

//接收到消息时触发
ws.onmessage = function (evt) {
    ...
};

//连接关闭时触发
ws.onclose = function (evt) {
    ...
};

在项目中 实用工具箱 -> WebSocket 界面,右侧请求接口发送消息,在左侧可以实时收到消息。

小结

本文纯属抛砖引玉,有问题,欢迎批评指正。

go-gin-api[2] 项目开箱即用,支持 WEB 界面一键安装,赶快去试试吧。

推荐阅读

参考资料

[1]

gorilla/websocket: https://github.com/gorilla/websocket

[2]

go-gin-api: https://github.com/xinliangnote/go-gin-api

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 新亮笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • WebSocket 示例界面
  • 第三方包
  • 代码封装
  • 小结
  • 推荐阅读
    • 参考资料
    相关产品与服务
    文档服务
    文档服务(Document Service,DS)是腾讯云数据万象提供云上文档处理服务,支持多种类型的文件生成图片或 html 格式的预览,可以解决文档内容的页面展示问题,满足 PC、App 等多端的文档在线浏览需求。同时,本产品还提供文本隐私筛查能力,可以有效识别文本中的身份证号、银行卡号、手机号等敏感数据,满足数据可用性和隐私保护的各种要求。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档