walkor兄:
我在使用workerman-chat的过程中发现,websocket是不能像传统http一样实现request-response的 那么我遇到一个很棘手的问题希望walkor兄弟以及论坛内其他的朋友可以帮助解决下。
问题就是 聊天过程中的消息传递问题(以前惭愧用的pomelo 里面send消息可以加回调 websocket不能- -) 如下:
1:A 发送信息给 B
2:A的信息先发送到了服务器,服务器进行数据的持久化等操作,那么此时如何做到让A知道服务器已经收到了他发给B的消息呢。
我想了几种办法感觉都是不是太好,一、Clien A 发送消息的时候进行存储当前消息体的md5值 然后带着md5值发送给服务器 ,服务器持久化以及其他操作完成后回复给A的时候也带着md5值,但是这种就比较损耗性能。二、Client A 发送消息是带着毫秒的时间戳,也就是说a->b 消息时 我把毫秒时间戳也存到库中 ,但是毫秒时间戳受制于客户端的时间设置。
纵观两种方案都不太好。一个性能一个不是完全可靠。
1)client-A向im-server发送一个消息请求包,即msg:R
2)im-server在成功处理后,回复client-A一个消息响应包,即msg:A
3)client-A和 im-server 需要有一个同意的msgid来确定是哪一条信息被服务器接受了- -就这样的一个问题
哦 对了- -我以前看过mqtt的qos机制 但是websocket 这种跟mqtt是两个意思 。而且也看了所谓的ack机制,以及幂等概念。但是无从下手跪求大神们帮助
客户端每个消息带一个消息id就行,消息id在客户端上自增,要求服务端返回数据时带上这个消息id
ok~ 我想的md5一下就是怕在数据库中重复~~ 我在看叮叮的websocket如何做的有结论了 分享在下面~~
好的,谢谢。只md5内容的话会有重复
@1:我的意思是md5当前的消息体包括了用户名以及当前时间戳
因为是client端发消息做这个事情 整体来说还好服务器那头只是带着md5的标示再回来而已@walkor 报告下最新进展。看了下简书的即时通讯 居然跳过了这个问题!!! 因为他简书无耻的无耻的无耻的用的http请求发协议没有用websocket ,websocket 在简书中只是用来推送和拉消息。。。。。。
这个也是个不错的方法,workerman-chat也能这样搞