Server
首页
Server
Android
iOS
PC
Web
Flutter
Uniapp
交流
搜索
登录
Server
商业版中,消息存储在mongdb 中,消息存储 _data 的base64 encode方式及decode 具体是怎么实现的,求代码指导
商业版中,消息存储在mongdb 中,消息存储 _data 的base64 encode方式及decode 具体是怎么实现的,求代码指导
lovo1
5月前
209
"_data":{"$binary":{"base64":"CAESBWhlbGxvQAM=","subType":"00"}}
_data 解码的方式,求指导
最新回复
(
6
)
x86
5月前
引用
2
楼
请参考这两个 issue,如果有不明白的,请具体补充:
https://bbs.wildfirechat.cn/thread-2332.htm
https://bbs.wildfirechat.cn/thread-2421.htm
lovo1
5月前
引用
3
楼
我直接用base64, 解编码为明文可以吗
lovo1
5月前
引用
4
楼
System.out.println(new String(Base64.getDecoder().decode(base64edData))); 测试main 获取消息时可以,不在商业版用此方法 解编码后,出现乱码
lovo1
5月前
引用
5
楼
你好!我想在JAVA 中解析成明文
x86
5月前
引用
6
楼
解码要和客户端消息的定义对应起来才能解开,不能完全撇开客户端的消息定义,直接将消息解开。
HeavyRain
5月前
引用
7
楼
首先IM服务数据库关系型数据库和MongoDB存储的数据都是一样的,字段名也一样,可以忽略掉数据库的差异,读取出来数据。
其次需要理解野火的消息体系,在野火的协议栈和IM服务传输和存储的都是统一的格式,在Server SDK和客户端SDK都叫MessagePayload,在IM服务内部为WFCMessage.MessageContent,在这2个结构体了定义的是相同的字段。
在客户端UI层和SDK中另外定义了一些消息内容,比如文本、图片、语音等,每个消息内容的格式都不相同,但在客户端的IMSDK中最终都会转化为MessagePayload,并交给协议栈和IM服务处理。所以无论那个消息内容,在协议栈和IM服务都是相同的格式,只有在客户端才转成千变万化的消息。
比如客户端发送一个文本消息的流程如下:1. UI层代码构建一个文件消息内容,调用SDK的发送方法 -》 2. SDK找到这个消息的Encode方法,encode出来这个消息的MessagePayload, 调用协议栈的发送方法 -》3. 协议栈发送MessagePayload到IM服务,IM服务保存到数据库,并把MessagePlayload推送到目的客户端协议栈 -》4. 目的客户端协议栈上报收到MessagePayload到SDK -》5. SDK根据MessagePaylod里面的消息类型找到对应的消息内容,调用这个消息内容的Decode方法,转成文本消息内容 -》 6. SDK回调UI层,收到文本消息。
所以如果要从数据库中读取出文本消息,需要2个步骤:首先在数据库中MessagePayload或者是WFCMessage.MessageContent是以二进制方式存储在_data字段,需要服务器端研发根据社区版IM服务源码里的方法,把二进制转化为MessagePayload;下一步是客户端研发拿到了MessagePayload,根据MessagePayload的type字段(这个字段是客户端消息内容的类型,比如文本是1,语音是2,图片是3,地理位置是4,等等)找到对应的消息内容类型,比如是文本消息还是图片消息等,用对应的消息内容来Decode出来。也就是说客户端研发需要告诉服务器端研发 消息内容 与 MessagePayload互相转换的规则。
MessagePayload中,有个特殊的字段是binaryContent,这个字段是二进制数据字段,在Web SDK和Server SDK的API中,直接使用二进制不方便,所以名字会改成bas64edBinaryContent或者base64edData,顾名思义二进制数据字段base64为字符串,在与其他平台核对数据时,需要注意。
返回
lovo1
创作新主题
搜索