文档章节

消息服务-websocket设计

萌萌哒的小萝卜
 萌萌哒的小萝卜
发布于 04/30 10:59
字数 1190
阅读 47
收藏 0

欢迎fork star 本人开源项目

本文介绍的所有代码均再码云中,如果对你有帮助,欢迎点个star支持,谢谢

star fork

1. 使用WebSocket而不使用stomp协议

STOMP在WebSocket之上提供了一个基于帧的线路格式(frame-based wire format)层,用来定义消息的语义。
乍看上去,STOMP的消息格式非常类似于HTTP请求的结构。
与HTTP请求和响应类似,STOMP帧由命令、一个或多个头信息以及负载所组成。

使用STOMP的好处在于,它完全就是一种消息队列模式,你可以使用生产者与消费者的思想来认识它,发送消息的是生产者,接收消息的是消费者。
而消费者可以通过订阅不同的destination,来获得不同的推送消息,不需要开发人员去管理这些订阅与推送目的地之前的关系,

2. 第一版是基于WebSocket协议之上的STOMP协议

第一版已经使用了很长时间,其中websocket链接推送这块一直不稳定,有时消耗很大资源,有时链接超时断开,其实都是因为使用了不熟悉的STOMP协议造成的。
STOMP协议当时是考虑不同客户端,可能不支持WebSocket协议,不如IE8,IE9等,会退而求其次使用轮询的方式,即发布订阅的形式依然可以接受到消息。所以引用了此协议,经过一年的测试,发现并不适用,所以,应该使用最原始的WebSocket更好。

3. 消息服务处理websocket流程

3.1 服务暴露websocket链接方式

服务暴露路径为/websocket/{token},访问时将{token}替换为获取到的token即可
http://10.189.xx.xx:xx/websocket/{token}等方式访问

3.2 客户端接入时

客户端接入时,首先验证token,与账户进行绑定,如果token认证不通过,拒绝连接
    private String loginName;
    private Integer userId;
    private Session session;
    private String status; //session状态
    private String device; //登录设备名称
    private Date loginTime;
接入后,查询系统消息记录表,重新发送消息状态为“未送达”的消息到客户端

3.3 websocket的session存储

目前服务器不考虑集群方式,session关系全部维护在内存中,存储结构如下
    private ConcurrentHashMap<String, HashMap<String,WebSocketClient>> sessionMap = new ConcurrentHashMap<String, HashMap<String,WebSocketClient>>();
    private ConcurrentHashMap<Integer, HashMap<String,WebSocketClient>> sessionMapWithUserId = new ConcurrentHashMap<Integer, HashMap<String, WebSocketClient>>();
另外提供了可拓展的session管理方式接口,如果将来集群使用,实现接口为redis存储即可

3.4 断开连接后

在session管理的结构中,删除对应的session信息

4. 消息系统接口的使用

4.1 发送消息

API对外接口:/ecgapi/api/message/sendMessage
服务内部接口:ecg-broker下的/message/sendMessage
参数:
{
  "content": "string",		--消息内容,可以是json串
  "receiver": [
    "string"			--接收者,非必填,不填时发送全部在线用户,填是传入用户ID,与第一版一致
  ],
  "title": "string",		--消息标题
  "type": 0    			--消息类型
}

4.2 消息管理-查询系统消息记录

API对外接口:/ecgapi/api/message/getMessagePage

查询系统消息的记录的page信息,可以查询消息的状态,发送时间,发送人,接受者等信息

4.3 消息管理-通过ID删除系统消息记录

API对外接口:/ecgapi/api/message/deleteMessageById
删除系统消息的记录。

4.4 消息管理-查询所有在线的客户端

API对外接口:/ecgapi/api/message/getWebSocketClients
客户端接入时,服务器存储的接入信息接口,可以查询所有客户端接入的详情

4.5 消息管理-收取消息

API对外接口:/ecgapi/api/message/collectMessage
如果有消息未送达情况,可以通过此接口,登录后主动收取消息

5. 有关消息推送的功能

5.1 报告分发时,发送消息

6. 后续功能扩展

6.1 android客户端消息推送

6.2 ios客户端消息推送

6.3 微信消息推送

微信消息推送使用的微信封装的api既可以,但是得有公众号,提前设计好模板,并且有些公众号每日推送的数量有限制

6.4 邮件系统的推送

邮件系统与使用的websocket不一样的协议

6.5 发送手机短信

需要接入运营商的api即可,收费

6.6 QQ消息

接入腾讯的API即可

© 著作权归作者所有

萌萌哒的小萝卜
粉丝 4
博文 57
码字总数 35795
作品 0
东城
私信 提问
Spray.io搭建Rest — 支持WebSocket

Spray.io尝试 使用Spray.io搭建Rest服务 Spray.io搭建Rest — 支持Twirl模板并部署 Spray.io搭建Rest — 支持WebSocket Spray.io搭建Rest — 支持WebSocket 工程地址:http://git.oschina.ne...

ForEleven
2014/04/30
1K
3
(websocket)协议中Ping Pong,长连接

- websocket协议,长连接;Http短连接 WebSocket如何建立连接、交换数据的细节,以及数据帧的格式。 WebSocket复用了HTTP的握手通道。具体指的是,客户端通过HTTP请求与WebSocket服务端协商升...

desaco
2018/12/25
0
0
基于 ThinkJS 的 WebSocket 通信详解

编者按:本文转载自 ThinkJS 知乎专栏。 前言 我们的项目是基于 ThinkJS + Vue 开发的,最近实现了一个多端实时同步数据的功能,所以想写一篇文章来介绍下如何在 ThinkJS 的项目中利用 WebS...

奇舞周刊
06/12
0
0
Spring消息之WebSocket

一、WebSocket简介 WebSocket 的定义?WebSocket是HTML5下一种全双工通信协议。在建立连接后,WebSocket服务器端和客户端都能主动的向对方发送和接收数据,就像Socket一样。 WebSocket 的由来...

jmcui
2018/05/06
0
0
八问WebSocket协议:为你快速解答WebSocket热门疑问

本文由“小姐姐养的狗”原创发布于“小姐姐味道”公众号,原题《WebSocket协议 8 问》,收录时有优化和改动。感谢原作者的分享。 一、引言 WebSocket是一种比较新的协议,它是伴随着html5规范...

JackJiang2011
04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL参数search_path影响及作用

search_path稍微熟悉PG就会用到,用法这里就不必讲,本篇主要讲它在程序里怎样处理。 1、GUC参数定义 这是个 config_string 参数 {{"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,...

有理想的猪
52分钟前
8
0
Qt程序各个平台打包发布及安装程序大全

本文链接:https://blog.csdn.net/zhengtianzuo06/article/details/78468111 通用: 1.准备图标 图标可以直接使用一般格式的图片制作, 比如jpg, png等 推荐使用Photoshop制作原始图 推荐使用I...

shzwork
今天
4
0
springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
22
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
10
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部