首页 新闻 会员 周边 捐助

Socket通讯的问题-TCP/IP 协议(100分散分,路过的大神留个脚印吧)

0
悬赏园豆:100 [已解决问题] 解决于 2013-09-11 22:21

A、B两个用户同时登录。假设A用户先登录成功,他就会向所有已登录用户发送一个A用户登录成功的消息。而B用户在登录时刚好接受到A用户这个登录成功这个消息,结果导致B用户无法登录成功

(客户端跟服务端是用一个socket长连接)

反戈的主页 反戈 | 初学一级 | 园豆:168
提问于:2013-09-10 23:52
< >
分享
最佳答案
0

想到一个办法,就是在消息里加个类型,如LOGIN为登录,CHAT为聊天,ERROR为错误等。

登录时,判断消息类型不为"LOGIN"或“ERROR”时,继续接受消息直到接受到类型为"LOGIN"或“ERROR”的消息为止

反戈 | 初学一级 |园豆:168 | 2013-09-11 19:20
其他回答(4)
1

在服务器转发时,先发送消息2,然后再将B加入在线列表。

收获园豆:40
幻天芒 | 园豆:37207 (高人七级) | 2013-09-11 00:15

服务器是先接受到消息3后接到消息2的,这样如何处理才能先发消息2呢?

支持(0) 反对(0) 反戈 | 园豆:168 (初学一级) | 2013-09-11 08:26

@反戈: 交换服务端代码位置吧。A的上线信息,转发的时候,肯定要遍历在线列表吧。那么在服务器发给B消息的时候,先发送消息2,再将B加入在线列表不就ok?不了解你的具体实现,你可以按照这思路分析下。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2013-09-11 09:53

客户端跟服务端通讯是一个socket连接,B在登录时,服务器是要发一个登录成功的消息给B的,但此时这个消息还没发出,就来了个 A客户上线的消息发给B(此时B跟服务器是连接上了的)。“A上线通知”先于“B登录成功”发给B。不知道这样解释是否清楚!

支持(0) 反对(0) 反戈 | 园豆:168 (初学一级) | 2013-09-11 13:41

@反戈: 设计有问题吧;A上线的消息,难道不是服务器遍历在线用户列表来转发的吗?如果此时B不在在线列表中,那又怎么转发呢。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2013-09-11 14:04

@幻天芒:登录是用登录的socket跟服务器通讯,登录成功后,关闭掉登录时的socket,重新再开个socket进行聊天会话?这样

支持(0) 反对(0) 反戈 | 园豆:168 (初学一级) | 2013-09-11 14:38

@反戈: 能实现也行。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2013-09-11 16:03
1

首先服务器端将网络通讯与业务处理分离,并实现消息的收发队列以及在线人员的缓存。其次,在客户端同样实现网络通讯与业务处理的分离,而后,在用户登录后,向服务器请求一次在线人员列表。

收获园豆:40
sinhbv | 园豆:2579 (老鸟四级) | 2013-09-11 08:59

不知道有没有什么相关资料作为参考呢!如通讯与业务处理如何分离,消息队列,在线人员缓存。

我也是有这样的思路,可是就是不知道从何下手!

支持(0) 反对(0) 反戈 | 园豆:168 (初学一级) | 2013-09-11 13:19

@反戈: 单说说的话,感觉很难体会,你可以看看网易做的pomelo,虽然是nodejs的项目,但是里边对方讲的比较好,可以参考一下其设计。

支持(0) 反对(0) sinhbv | 园豆:2579 (老鸟四级) | 2013-09-11 14:09
0

好奇怪,为什么先收到2就登录失败??A和B是同一个帐号???协议设计有问题吧

收获园豆:10
angelshelter | 园豆:9914 (大侠五级) | 2013-09-11 09:32

A,B不是同个帐号,客户端跟服务端就一个socket连接。客户端本来是要接受到相关用户登录的验证消息,结果接受到了其他帐号发来的上线消息。

支持(0) 反对(0) 反戈 | 园豆:168 (初学一级) | 2013-09-11 13:22

@反戈: 那怎么了,应该有一个字段定义它是什么包,到底是成功登录包,还是别人上线包,针对不同的包,进行不同的解析呀。

支持(0) 反对(0) angelshelter | 园豆:9914 (大侠五级) | 2013-09-11 17:14
0

没明白你的意思 ,协议头一般都包括原地址和目标地址,判断一下不是自己的return掉不就完事了,还是我没理解你描述的意思,如果发的是广播包的话比较难处理,要解包通过包结构获取第一个发此协议的机器mac,当然这个结构体是你自己定义好的

收获园豆:10
diorlv2010 | 园豆:188 (初学一级) | 2013-09-11 16:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册