消息服务-websocket设计

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即可

转载于:https://my.oschina.net/angelbo/blog/3044292

OBS WebSocket (.NET) 是 OBS Studio 的插件 `obs-websocket` 提供的一个 .NET 库,它使得开发者可以利用 C# 或其他基于.NET的语言轻松地向 OBS 发送控制命令、接收事件通知并请求状态信息。 ### 消息处理 #### 基本概念: 1. **连接建立**:首先需要创建一个WebSocket客户端,并通过指定地址和端口与运行有 obs-websocket 插件的服务端建立连接; 2. **发送指令**:一旦建立了稳定可靠的通信通道之后,则可通过 JSON 格式的消息包来发送各种类型的指令给服务器。例如切换场景、调整音量大小等操作都可以封装成相应的消息体传送给目标机器上的 OBS 实例; 3. **监听响应**:除了主动发起的动作之外,还可以订阅某些特定条件触发的通知机制,当满足设定好的规则时会自动推送最新的数据回来更新到本地应用界面上显示出来; 4. **断开重连**:考虑到网络波动可能导致意外掉线的问题,在设计上应该加入智能检测及尝试恢复的功能模块保障服务连续可用性。 #### 示例代码片段: 下面是一段简单的C#示例程序用于演示如何使用此库来进行基本交互: ```csharp using ObsWebsocketDotNet; //... var client = new ObsClient(); client.Connected += Client_Connected; // 连接成功后的回调函数注册 await client.ConnectAsync("localhost", 4455); private static void Client_Connected(object sender, EventArgs e) { Console.WriteLine($"Connected to {((ObsClient)sender).Host}:{((ObsClient)sender).Port}"); } ``` 以上就是关于 `obs-websocket-dotnet` 中有关于消息处理方面的简单介绍啦! --
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值