前言
已经实现了服务端的配置以及客户端的展示,下面需要进行单聊和群聊功能的实现,以下为具体的实现方式和代码。
单聊
LayIM官网文档对发送消息所包含的信息
这是我自己完成单聊后,发送消息的时候包含的信息
根据以上信息可知,在消息发送的时候会消息体中会包发送者(mine)的结构和接受者(to)的结构,其中
- 发送者(mine)包含了发送人的头像、id、发送内容等
- 接受者(to)包含了接受者的头像、id、聊天类型等
其中聊天类型(type)一般分friend和group两种,friend为单聊,group为群聊
但是这么多的信息没必要全部获取,值需要取需要用到的内容,接受者的ID和发送者发送的内容即可。因为后面需要区分单聊、群聊、离线消息等其他的消息类型,
所以在发送消息的结构体中,需要带有消息的类型
注意:消息的类型与聊天类型不同,消息类型后台程序会根据消息类型,进行不同的消息处理程序。而聊天类型(type)是前台页面就行不同的消息窗口展示,而且friend和group消息结构不同
前端页面发送时候的消息体结构
1 | msgtype:(status=="offline"?msgType.offline:msgType.chatfriend), |
- msgtype(消息类型,后台程序处理的类)
- content(发送者发送的内容)
- toid(接受者的id)
消息体结构设计
1 | /** |
解析后的消息类型(MsgType.java)
1 | /** |
其中时间戳在消息接收的时候会用到,用以显示发送or接收的时间。
前后端的消息结构体设计完成后,下面就需要对发送过来的消息进行接受、解析、处理WesServerAioHandler类
进行消息的处理
当客户端完成发送的消息后,服务端就进行消息的解析:WesServerAioHandler类的decode的方法。
对解析完成后的消息进行处理。
处理解析后的消息messageHandle方法
以下截取messageHandle方法中主要的地方
1 | //消息类型为TEXT |
其中MsgHandler类为消息的转发处理器,它在服务端初始化的时候,将各消息处理的类进行了实例化并添加到一个Map类型中,具体的代码不进行展示。
1 | //存储消息处理的类 |
通过反序列化得到具体的消息处理类
点对点消息处理类
1 | /** |
Tio.sendToUser发送到指定人;
消息格式和相遇格式的组装 ConvertMsg.java
1 | /** |
convertMsgBody方法构建消息体响应格式—客户端接收消息的格式
fromText方法为响应请求数据格式的组装
消息的接收
先看看LayIM官网对接收消息所包含的信息
其中1为接收消息的layim接口,2为消息内容的具体字段。
下面是为在HTML页面中,对单聊和群聊进行了判断,分别进行展示。
1 | var msg=JSON.parse(e.data); |
根据消息类型进行消息的展示
群聊
群聊的代码就不展示了,群聊原理和单聊一样。单聊和群聊区别为:调用的方法不同,和body.getToid()
不同
区别
区别 | 单聊 | 群聊 |
---|---|---|
调用方法 | sendToUser | sendToGroup |
Toid | 消息接收者的id | 消息群组的id |
注意
消息群组的id也是在握手成功后进行绑定
具体参考WesMsgHandler
类中的handshakeUser
方法
展示效果
结束
单聊和群聊已经结束了,但是如果你发送的用户不在线怎么办,离线消息功能也要进行实现,好友的上下线也要进行通知。
参考内容
https://gitee.com/cctvmfc/t-io
https://gitee.com/natral/tio-showcase
https://my.oschina.net/panzi1/blog/1577007#h1_3