链接建立
- 技术承载:HTTP+websocket
- 技术关键点:同一个浏览器页面和同一个服务端只建立一条websocket,可以通过HTTP请求动态增加或减少websocket传输的数据内容;数据内容自身具备数据类型分辨能力;
- 网络元素: 浏览器页面 新版账户控制端 GSC聊天代理
- ticket : ticket有效时长5分钟,使用一次后自动失效,由平台账户系统控制;
- websocketKey :每条websocket的标识,由websocket服务端生成;
- chatRoomId :每个聊天监控窗口的ID,在同一个浏览器页面上唯一,由客户端生成;
- 用户选择产品、区服、频道点击实时监控,浏览器页面通过HTTP请求平台账户系统获取开启实时监控必要数据(ticket和聊天监控服务地址);
- 浏览器页面根据返回的聊天监控服务地址判断是否需要建立新的websocket,如果不需要则直接通过第5步更新websocket传输的数据内容;
- 浏览器页面携带ticket以及chatRoomId去和聊天监控服务建立websocket链接;
- 聊天代理通过HTTP请求平台账户系统验证ticket的合法性;验证通过后,生成websocketKey并和浏览器页面建立websocket链接(过程略);
- 浏览器页面通过HTTP请求更新websocket的数据传输内容;通过websocketKey来增加或删除chatRoomId;增加时还需要传递游戏产品、游戏区服、游戏频道信息;
浏览器页面 数据分发
- 元素:数据消费tab 数据分发Main
- 事件:gamechat_chatRoomId_event
- 考虑页面上会存在多个聊天监控tab, 每个聊天监控的 数据消费tab注册gamechat_chatRoomId_event监听事件; 数据分发Main在接到websocket的消息后根据chatRoomId进行消息发布;
聊天代理数据推送
- 在内存中维护一份浏览器页面的websocketKey和chatRoomId关系;Hash表即可, key:产品+语言+游戏服+频道, value是websocketKey+chatRoomId的list;
- 在更新完solr后, 进行自动禁言;自动禁言处理完成后, 从Hash表中获取本次聊天记录是否存在监控的chatRoomId,存在的话,获取到websocketKey对应的websocket链接,把消息推下去;推送下去的聊天消息中需要携带chatRoomId;
聊天日志实时监控采用WebScoket进行实时推送聊天数据
采用spring的Websocket + SockJs + Stomp协议实现。
加入jar包:spring-websocket-4.2.4.RELEASE.jar、spring-messaging-4.2.4.RELEASE.jar
实现过程:
1. 建立WebSocketConfig,配置以下参数:
① WebSocket客户端向服务端发送信息固定前缀
② 服务端向客户端推送消息固定前缀
③ WebSocket订阅地址前缀
④ WebSocket连接地址(并配置允许SockJs连接以及加入拦截器)
2.建立WebSocketInterceptor,拦截器中加入连接WebSocket之前与连接之后的操作
3.建立Controller,加入@MessageMapping的方法用于接收与处理客户端发送的信息
4.(可选)建立StompDisconnectEventListener,监听连接断开时进行操作。
至此,WebSocket服务端建立完毕。
聊天日志实时监控WebSocket客户端连接及消息推送:
一、携带ticket请求webSocket连接。WebSocket连接地址:
ws://127.0.0.1:7380/chatproxy/websocket/connect
二、订阅实时监控 订阅地址: /client/gameChat/monitoring
三、向webSocket服务端发送消息新增chatRoomId
发送地址:/server/addOrDelChatRoomId
参数以消息形式发送(Json格式):如:
{
“chatRoomId”:”1”,
“productId”:”10000941”,
“localeId”:”01”,
“serverIds”:”2548,2549,2550”(游戏服为全部时传-1即可)
}
四、删除chatRoomId时同第三步, 删除时游戏服可不传。
五、webSocket推送数据返回格式:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23{
"chatRoomIds":[
"1"
],
"chatLogs":[
{
"id":null,
"language":"01",
"productId":"1111111",
"productName":"测试",
"gameServerId":null,
"gameServerName":null,
"userId":"111111111111111111111",
"roleId":"1231232132131",
"roleName":"test",
"chatTime":"2019-07-22 17:04:58",
"createTime":"2019-07-22 17:04:58",
"gameChannelId":"",
"gameChannelName":null,
"chatInfo":"测试聊天信息"
}
]
}