在慕课网学习了GO实现websocket消息推送,这边记录一下

依赖包:

go get github.com/gorilla/websocket

然后是一个connection包

package implimport ("errors""github.com/gorilla/websocket""sync"
)type Connecttion struct {wsConn    *websocket.ConninChan    chan []byteoutChan   chan []bytecloseChan chan byteisClosed  boolmutex     sync.RWMutex
}func InitConnection(wsConn *websocket.Conn) (conn *Connecttion, err error) {conn = &Connecttion{wsConn:    wsConn,inChan:    make(chan []byte, 1000),outChan:   make(chan []byte, 1000),closeChan: make(chan byte, 1),}//启动读携程go conn.readLoop()//启动写携程go conn.writeLoop()return
}//APi
func (conn *Connecttion) ReadMessage() (data []byte, err error) {select {case data = <-conn.inChan:case <-conn.closeChan:err = errors.New("connection is closed")}return
}func (conn *Connecttion) WriteMessage(data []byte) (err error) {select {case conn.outChan <- data:case <-conn.closeChan:err = errors.New("connection is closed")}return
}func (conn *Connecttion) Close() {//线程安全,可重入的Close,可并发调用conn.wsConn.Close()//这行代码只执行一次conn.mutex.Lock()if !conn.isClosed {close(conn.closeChan)conn.isClosed = true}conn.mutex.Unlock()
}//内部实现
func (conn *Connecttion) readLoop() {var (data []byteerr  error)for {if _, data, err = conn.wsConn.ReadMessage(); err != nil {goto ERR}//阻塞在这里,等待inChan有空闲位置select {case conn.inChan <- data:case <-conn.closeChan://closeChan被关闭的时候goto ERR}}
ERR:conn.Close()
}func (conn *Connecttion) writeLoop() {var (data []byteerr  error)for {select {case data = <-conn.outChan:case <-conn.closeChan:goto ERR}if err = conn.wsConn.WriteMessage(websocket.TextMessage, data); err != nil {goto ERR}}
ERR:conn.Close()
}

调用示例:

package mainimport ("github.com/gorilla/websocket""go-websocket/impl""net/http""time"
)var (upgrade = websocket.Upgrader{//允许跨域CheckOrigin: func(r *http.Request) bool {return true},}
)func wsHandler(w http.ResponseWriter, r *http.Request) {var (wsConn *websocket.Connerr    errordata   []byteconn   *impl.Connecttion)if wsConn, err = upgrade.Upgrade(w, r, nil); err != nil {return}if conn, err = impl.InitConnection(wsConn); err != nil {goto ERR}go func() {var (err error)for {if err = conn.WriteMessage([]byte("heartbeat")); err != nil {return}time.Sleep(1 * time.Second)}}()for {if data, err = conn.ReadMessage(); err != nil {goto ERR}if err = conn.WriteMessage(data); err != nil {goto ERR}}
ERR://关闭连接操作conn.Close()
}
func main() {http.HandleFunc("/ws", wsHandler)http.ListenAndServe("0.0.0.0:7777", nil)
}

测试网站:http://www.jsons.cn/websocket

GO实现websocket消息推送相关推荐

  1. java socket 推送机制_Java中websocket消息推送的实现代码

    一.服务层 package com.demo.websocket; import java.io.IOException; import java.util.Iterator; import java ...

  2. node.js Websocket消息推送---GoEasy

    Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快 浏览器兼容性:GoEasy推送支持websocket 和 ...

  3. SpringBoot2.x 整合websocket 消息推送,单独发送信息,群发信息

    根据公司需求在SpringBoot项目中集成站内信,于是,我做了一个SpringBoot2.x 整合websocket 消息推送,给指定用户发送信息和群发信息即点点对方式和广播方式2种模式. 文章目录 ...

  4. Java版WebSocket消息推送系统搭建

    Java版WebSocket消息推送系统搭建 最近在做消息推送,网上查了一些资料,开始想的是用MQ来做,后面发现用WebSocket来做的话感觉应该要简单点,话不多说,准备撸代码. 后端核心代码 /* ...

  5. WebSocket消息推送和聊天功能实现

    WebSocket消息推送 SpringBoot集成WebSocket实现消息推送和聊天Demo gradle引入依赖 测试用的Controller 两个测试页面 WebSocket的Endpoint ...

  6. java/web/springboot项目使用WebSocket消息推送

    java/web/springboot项目使用WebSocket消息推送 最近项目中,有消息推送的广播和在线咨询的功能,以前也没搞过啊,有些小伙伴估计也是,那肯定要赶紧学习起来啊~ 不说废话,今天就告 ...

  7. EasyGBS国标平台新增WebSocket消息推送,可快速定位视频播放故障

    WebSocket是建立在TCP之上的一种双向通信协议,它能实现浏览器与服务器全双工通信,在性能上具有较强的优势.尤其是在海量并发及客户端与服务器交互负载流量大的情况下,WebSocket可以极大节省 ...

  8. 微信小程序使用swoole实现websocket消息推送

    swoole我个人建议在linux环境下操作,毕竟在windows下有那么一点点麻烦.首先linux安装php和swoole环境(有手就行,建议百度). 因为我们的业务是实现消息推送,也就是在完成特定 ...

  9. 千万级WebSocket消息推送服务技术分析

    拉模式和推模式区别 拉模式(定时轮询访问接口获取数据) 数据更新频率低,则大多数的数据请求时无效的 在线用户数量多,则服务端的查询负载很高 定时轮询拉取,无法满足时效性要求 推模式(向客户端进行数据的 ...

最新文章

  1. 重拾IP路由选择:CCNA学习指南中的IP路由选择
  2. element ui怎么调图标的大小_大明:网页字体大小怎么调?教你方法一键搞定
  3. 传值类型_Java内存管理:Stackoverflow问答-Java是传值还是传引用(十一)
  4. 【AI视野·今日Robot 机器人论文速览 第十三期】Wed, 23 Jun 2021
  5. 2017-4-20实体类,数据访问类.字符串攻击.防攻击
  6. leetcode java输入输出方法,有关IntelliJ IDEA中LeetCode插件配置问题
  7. 一致性hash算法学习
  8. vuex - redux - mobx
  9. 计算机科技兴趣小组活动总结,信息技术兴趣小组活动总结
  10. 分享:ViewState压缩方法
  11. 2022年计算机软件水平考试网络管理员(初级)练习题及答案
  12. 常微分方程——一阶微分方程的初等解法
  13. java简单实现在线资源多线程下载,断点续存,限制最大正在下载数
  14. 龙芯Fedora21平台制作docker镜像,并且解决vi乱码问题
  15. 一份Yann LeCun等16个顶级数据科学家给新人的建议
  16. 认识USB、Type-C、闪电、雷电接口
  17. 段码液晶显示屏液交期有多长?
  18. C++ Primer 第5版--练习9.14
  19. flask-restful 和 blueprint
  20. Ubuntu Linux 3D桌面完全教程 显卡驱动安装方法 compiz特效介绍

热门文章

  1. Oracle数据同步解决方案之databus
  2. Linux上 journal 可以删除吗?
  3. SpringBoot - 构建监控体系01_使用 Actuator 组件实现及扩展系统监控
  4. 手机php开发工具_最热门的PHP开发工具
  5. mysql外键约束分数_MySQL 高级查询
  6. MyBatis-Plus入门教程
  7. [转]老(道)孔(儒)轮流做庄
  8. 20+富有创意的BuddyPress网站
  9. 我们文本分析了贾跃亭2017年全部公开信,发现他近期喜欢用“责任”“致歉”...
  10. 浙江新2014挂历制作,供应温州挂历印刷公司