A、B两个用户同时登录。假设A用户先登录成功,他就会向所有已登录用户发送一个A用户登录成功的消息。而B用户在登录时刚好接受到A用户这个登录成功这个消息,结果导致B用户无法登录成功
(客户端跟服务端是用一个socket长连接)
想到一个办法,就是在消息里加个类型,如LOGIN为登录,CHAT为聊天,ERROR为错误等。
登录时,判断消息类型不为"LOGIN"或“ERROR”时,继续接受消息直到接受到类型为"LOGIN"或“ERROR”的消息为止
在服务器转发时,先发送消息2,然后再将B加入在线列表。
服务器是先接受到消息3后接到消息2的,这样如何处理才能先发消息2呢?
@反戈: 交换服务端代码位置吧。A的上线信息,转发的时候,肯定要遍历在线列表吧。那么在服务器发给B消息的时候,先发送消息2,再将B加入在线列表不就ok?不了解你的具体实现,你可以按照这思路分析下。
客户端跟服务端通讯是一个socket连接,B在登录时,服务器是要发一个登录成功的消息给B的,但此时这个消息还没发出,就来了个 A客户上线的消息发给B(此时B跟服务器是连接上了的)。“A上线通知”先于“B登录成功”发给B。不知道这样解释是否清楚!
@反戈: 设计有问题吧;A上线的消息,难道不是服务器遍历在线用户列表来转发的吗?如果此时B不在在线列表中,那又怎么转发呢。
@幻天芒:登录是用登录的socket跟服务器通讯,登录成功后,关闭掉登录时的socket,重新再开个socket进行聊天会话?这样
@反戈: 能实现也行。
首先服务器端将网络通讯与业务处理分离,并实现消息的收发队列以及在线人员的缓存。其次,在客户端同样实现网络通讯与业务处理的分离,而后,在用户登录后,向服务器请求一次在线人员列表。
不知道有没有什么相关资料作为参考呢!如通讯与业务处理如何分离,消息队列,在线人员缓存。
我也是有这样的思路,可是就是不知道从何下手!
@反戈: 单说说的话,感觉很难体会,你可以看看网易做的pomelo,虽然是nodejs的项目,但是里边对方讲的比较好,可以参考一下其设计。
好奇怪,为什么先收到2就登录失败??A和B是同一个帐号???协议设计有问题吧
A,B不是同个帐号,客户端跟服务端就一个socket连接。客户端本来是要接受到相关用户登录的验证消息,结果接受到了其他帐号发来的上线消息。
@反戈: 那怎么了,应该有一个字段定义它是什么包,到底是成功登录包,还是别人上线包,针对不同的包,进行不同的解析呀。
没明白你的意思 ,协议头一般都包括原地址和目标地址,判断一下不是自己的return掉不就完事了,还是我没理解你描述的意思,如果发的是广播包的话比较难处理,要解包通过包结构获取第一个发此协议的机器mac,当然这个结构体是你自己定义好的