Go语言实现websocket推送程序

 更新时间:2023年05月18日 17:30:41   作者:永远的麦田  
这篇文章主要介绍了Go语言实现websocket推送程序,WebSocket是基于TCP的一个双向传输数据的协议,和HTTP协议一样,是在应用层的,他的出现,是为了解决网页进行持久双向传输数据的问题

最近要在一个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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang极简入门教程(三):并发支持

    Golang极简入门教程(三):并发支持

    这篇文章主要介绍了Golang极简入门教程(三):并发支持,本文讲解了goroutine线程、channel 操作符等内容,需要的朋友可以参考下
    2014-10-10
  • Golang中可比较的数据类型详解

    Golang中可比较的数据类型详解

    在日常开发中,比较操作是最常用的基本操作之一,可以用来判断变量之间是否相等或者对应的大小关系,本文将深入解析 Golang 中可比较的数据类型,并结合代码示例来说明如何在不同情况下进行比较,需要的朋友可以参考下
    2024-01-01
  • 深入理解Golang的反射reflect示例

    深入理解Golang的反射reflect示例

    本文主要介绍了Golang的反射reflect示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Go中的动态速率限制有效控制流量

    Go中的动态速率限制有效控制流量

    这篇文章主要为大家介绍了Go中的动态速率限制有效控制流量,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 浅析Go语言bitset的实现原理

    浅析Go语言bitset的实现原理

    bitset包是一个将非负整数映射到布尔值的位的集合,这篇文章主要通过开源包bitset来为大家分析一下位集合的设计和实现,感兴趣的可以学习一下
    2023-08-08
  • 9个Golang中map常用示例分享

    9个Golang中map常用示例分享

    这篇文章主要和大家分享9个Golang中map可能是常用的使用案例,从1到9,越来越厉害。文中的示例代码讲解详细,希望对大家学习Golang有一定的帮助
    2023-02-02
  • Go语言学习之接口使用的示例详解

    Go语言学习之接口使用的示例详解

    Go语言并没有类的定义,接口可以说Go语言最接近于类的实现方式,但是更轻量。本文将通过一些简单的示例和大家介绍下Go语言中接口的使用,感兴趣的可以学习一下
    2022-11-11
  • golang如何使用gomobile进行Android开发

    golang如何使用gomobile进行Android开发

    golang可以开发android,使用golang开发android需要下载安装gomobile,下面这篇文章主要给大家介绍了关于golang如何使用gomobile进行Android开发的相关资料,需要的朋友可以参考下
    2023-01-01
  • Go Grpc Gateway兼容HTTP协议文档自动生成网关

    Go Grpc Gateway兼容HTTP协议文档自动生成网关

    这篇文章主要为大家介绍了Go Grpc Gateway兼容HTTP协议文档自动生成网关示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • grpool goroutine池协程管理

    grpool goroutine池协程管理

    这篇文章主要介绍了grpool goroutine池协程管理,goroutine协程非常轻量级,这也是为什么go支持高并发,但是goroutine频繁创建销毁对GC的压力比较大,文章围绕主题展开详细的内容介绍,需要的小伙伴可以参考一下
    2022-06-06

最新评论