文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go语言实现websocket推送程序

2023-01-17 12:00

关注

最近要在一个go实现的K线服务器上追加一个websocket推送功能。

初步设想是在各品种每分钟的数据完成后立即向各订阅单位推送对应的K线数据。

一、场景抽象

1用户连接上服务器

2用户订阅某品种的某周期

3用户退订某品种某周期

4用户断开服务器

订阅:

推送:

二、程序框架

由于go语言不熟,幸好网上有人做了成熟的框架:GitHub - gorilla/websocket: A fast, well-tested and widely used WebSocket implementation for Go.这个解决了怎样使用websocket的问题

三、主要业务逻辑

每个连接开两个线程

一个线程进行数据写入writePump,一个线程进行数据读取readPump,每当有客户端连接上服务器后,立即开启这两个线程。

读线程逻辑图:

写线程逻辑图:

程序启动时开一个总控线程func (h *Hub) Run()

此线程用来处理客户端的连接,断开,订阅和向订阅信息的客户端作相应信息的广播。

逻辑图如下:

处理注册

处理注册的逻辑非常简单,只是将客户端的指针放置于指针map中即可,代码如下:

// 注册,客户端连接上来的处理逻辑
func (h *Hub) registerMsg(client *Client) {
	h.clients[client] = true
}

处理注销

注销需要分两步走,首先把客户端指针集合中的对应指针删除,同时删除对应的发送通道。然后遍历内容订阅集合,删除对应的客户端指针的元素,最后,若发现某订阅内容上已经没有任何客户端指针,将其订阅内容一并删除。

程序逻辑如下:

订阅处理

订阅最主要的是订阅关系,我们可以用合约.周期作为key,使用客户端连接上来的指针集作为value,每当有用户订阅某内容时,将相应内容下面的指针集上加上对应此用户的指针即可,订阅关系如下:

推送处理

推送处理分两种类型,一种为用户订阅的数据推送给到他们,一种为心跳包推送给到30秒内没有数据推送或订阅动作的用户。

推送订阅的内容:当用户订阅的类型数据到达时,系统检查此订阅上的用户指针,将数据推送到对应指针的通道中,由各通道自行推送给各自的客户端。

推送心跳包:当某个连接上来的客户端30秒内没有订阅请求或是推送数据,系统将自动推送心跳包,以维持连接不被断开。

到此这篇关于Go语言实现websocket推送程序的文章就介绍到这了,更多相关Go websocket内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯