websocket send 消息后 服务器如何使用唯一id回执给client端
发布于 8 年前 作者 mrzeta 17446 次浏览 来自 问答

坑如下: 1)client-A向im-server发送一个消息请求包,即msg:R 2)im-server在成功处理后,回复client-A一个消息响应包,即msg:A 3)client-A和 im-server 需要有一个统一的msgid来确定是哪一条信息被服务器接受了- - 至此client-A才能知道当前发送消息的状态是否正常 看了下钉钉的请求木有看懂- -! 跪求大神们帮忙~~

14 回复

在client发送消息的时候生成一个uuid发过去,服务端处理后回发该uuid

@chloe 兄弟~~我想过这个办法,用当前时间毫秒做uuid,甚至md5当前消息体做uuid。但是一个是可能会因为客户端时间问题有重复的,第二是因为md5拖累这个即时通讯的性能。再有就是以前写php、后来用pomelo做IM都是可以回调传递信息的 但是现在用socket 思想不太一样了- -!

你用的哪个库?

由于js不存在线程安全问题,用一个递增id做标识也可以吧。在服务器每个socket也是独立的,也不存在辨识问题。

6楼的建议是可行的,用递增int,或时间戳都可以。 服务端都是独立的 socket,与每个客户端是一对一的,要区分的只是同一个客户端先后发送的不同消息,对应的服务端响应。 严格来说,只要客户端和服务端都是按照一问一答顺序进行对话,其实连 id 都可以不要。。

@klesh 是的 想过递增id但是js客户端那边容易被人模拟自增id发送到服务器。

@myy Client<======>Server 的确可以说是一问一答,但是举个例子啊:client a send msg -----> server 因为网络原因server回执给client的消息没成功。那么client就失败了。此时 client b 上线了踢了以前的client a 那么client b就要有相应的处理机制。所以需要有一个唯一的id 处理。我看了下简书的 居然发消息没有用websocket 用的http!!!http!!!啊!!!!已跪。

@mrzeta 为了兼容所有浏览器吧,毕竟不是都有websocket

@DevinXian 恩~~ 简书这么做应该是,我看了钉钉的没用用http发消息,但是他的逻辑没看明白 那些id来回来去的 一会再去看看,想解决这个问题主要也是为了到时候websocket在android iOS上收发消息的时候能够解决 唯一id的问题~~

@mrzeta 用js的来编写都能模拟,taobao客户端弄得比较复杂吧,还做了个ua什么的,一样有人模拟,我觉得你先不用考虑有人模拟这个情况

你用时间戳或者UUID一样可以模拟啊。正如12楼所讲,防模拟是个无解的问题

感谢楼上的每位参与回答的人 ,暂时定的跟淘宝的钉钉学,采用毫秒时间戳+ 3-5位的随机数~~。谢谢大家的帮助 凡是回复的人 我可以提供一个月的vpn账号~~ 自己的服务器 基于pritunl搭建的~~ 有需要的喊我~~

回到顶部