日期:2014-05-17  浏览次数:20841 次

socket客户端的几个疑点
C/S模式下点对多。客户端是怎么接收来自服务器不定时指令的。
我想实现就是像qq弹窗那样的效果,服务器不定时向客户端发送指令,客户端却是不知如何接受。
想了几个思路,求大牛指点指点。
1:客户端socket异步接收,根据接收到的服务器指令完成与服务器的交互。比如客户端a向服务器发送指令x 服务器将指令x发给客户端b。疑点:异步接收如何接受。假如b先向服务器发送指令y,服务器回复指令z,但x比z先到达,会不会产生什么严重的后果。
2:客户端与服务器建立三个连接。一个连接保持与服务器的长连接。一个连接实现与服务器同步通信。一个连接异步接收服务器的指令,实现客户端之间交互。疑点:这样一来服务器负担翻了三番,同时也不知道如何在服务器端区分同一个客户端的三个连接那个是哪个。
3:客户端做成一个简单服务器端,检测端口侦听来自四面八方的连接请求。疑点:客户端的ip不固定。

------解决方案--------------------
c/s服务器端不需要保存客户端socket,服务器只所以返回客户端信息,都是因为客户端首先访问服务器,而服务器能够accept到客户端连接并接收数据,accept操作本身就返回了客户端socket,程序在接受一个请求之后计算出结果就直接用这个socket返回信息就可以了,不需要再额外去找其它的什么socket
------解决方案--------------------
大的方面先不去讨论。针对你的问题:

引用:
1:客户端socket异步接收,根据接收到的服务器指令完成与服务器的交互。比如客户端a向服务器发送指令x 服务器将指令x发给客户端b。疑点:异步接收如何接受。假如b先向服务器发送指令y,服务器回复指令z,但x比z先到达,会不会产生什么严重的后果。

呵呵如果是短链接,那么就只有轮询了。或者如果你的服务器发现客户端是在外网可以直接访问的,可以在客户端登录时命令客户端开启一个监听服务,客户端也是一个服务器。当然,这其实增加了复杂性,但是提高了灵活性。

而当客户端无法在外网直接发起访问,可以尝试打洞。当然,这也是增加了复杂性,但是提高了灵活性。

最后才是复杂性最低的做法,长连接。这时候,服务器回复指令z之后,如果x到达了,那么服务器又回复一个新的指令了。


引用:
12:客户端与服务器建立三个连接。一个连接保持与服务器的长连接。一个连接实现与服务器同步通信。一个连接异步接收服务器的指令,实现客户端之间交互。疑点:这样一来服务器负担翻了三番,同时也不知道如何在服务器端区分同一个客户端的三个连接那个是哪个。

如果你说的是短链接,那么3个、30个都没有关系。毕竟是“短”的嘛!需要时才临时建立,然后没用了就丢弃。如果是长连接,那么长连接是双向的,无所谓为了接收创建一个、为了发送创建一个。在消息中,会有“消息ID”作为标记,比如从0一直到增长到18446744073709551615,然后再从0开始。发送消息时有SID编号,收到消息时有SID说明这是回复什么消息的。如果你要求消息回复是顺序的,就可以判断收到的回复消息号是否恰好是最后发送的SID,如果不是就可以重发SID对应的消息。如果你要求消息回复是异步的,那么就无需要求SID同步,而是匹配到刚刚发送的消息然后提交给应用层。也就是说,仅仅建立一个长连接,就可以即收也发消息,而且也可以是异步并发处理消息

引用:
3:客户端做成一个简单服务器端,检测端口侦听来自四面八方的连接请求。疑点:客户端的ip不固定。

客户端之所以为客户端,那么肯定它要先去登录到服务器。
------解决方案--------------------
引用:
c/s服务器端不需要保存客户端socket,服务器只所以返回客户端信息,都是因为客户端首先访问服务器,而服务器能够accept到客户端连接并接收数据,accept操作本身就返回了客户端socket,程序在接受一个请求之后计算出结果就直接用这个socket返回信息就可以了,不需要再额外去找其它的什么socket

这个根本处理不了大量并发问题
------解决方案--------------------
http://blog.csdn.net/xiarenwang/archive/2010/08/03/5785576.aspx
建议你看下上面的链接,总共5片,很详细,里面那个定制消息格式或许就是你想要的