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

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

文章目录:

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

WebSocket 示例界面

第三方包

  • gorilla/websocket[1]

websocket 链接时支持配置项:

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 协议:

// 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,同时支持使用日志、数据库、缓存等操作:

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

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 示例代码:

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

目录
相关文章
|
4月前
|
JSON 运维 Go
Go 项目配置文件的定义和读取
Go 项目配置文件的定义和读取
|
24天前
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
61 4
|
24天前
|
缓存 监控 前端开发
Go 语言中如何集成 WebSocket 与 Socket.IO,实现高效、灵活的实时通信
本文探讨了在 Go 语言中如何集成 WebSocket 与 Socket.IO,实现高效、灵活的实时通信。首先介绍了 WebSocket 和 Socket.IO 的基本概念及其优势,接着详细讲解了 Go 语言中 WebSocket 的实现方法,以及二者集成的重要意义和具体步骤。文章还讨论了集成过程中需要注意的问题,如协议兼容性、消息格式、并发处理等,并提供了实时聊天、数据监控和在线协作工具等应用案例,最后提出了性能优化策略,包括数据压缩、缓存策略和连接管理优化。旨在帮助开发者更好地理解并应用这些技术。
42 3
|
24天前
|
存储 JSON Go
如何在 Go 项目中隐藏敏感信息,比如避免暴露用户密码?
在Go语言开发中,用户信息管理常涉及敏感数据如密码的处理。为防止这些数据暴露给客户端,本文介绍了三种方法:使用JSON标签忽略字段、自定义序列化逻辑、使用数据传输对象(DTO),以确保用户数据的安全性。通过这些方法,可以有效控制数据输出,避免敏感信息泄露。
26 1
|
24天前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
73 1
|
24天前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
62 1
|
2月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
87 11
|
2月前
|
Go
使用go语言将A助手加入项目中
使用go语言将A助手加入项目中
24 2
|
1月前
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。
|
2月前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
53 2