目前我在服务端每隔5分钟给每个客户端发送一次存活包,每隔半小时统计一次客户端的反馈包,丢包超过50%的判定为断线,客户端中每收到一个存活包马上返回一个反馈包,每隔半小时统计存活包的数量,丢包超过30%则认为与服务器连接端开。现在就是如果客户端网络断开后,要隔半小时才提示用户连接断开,及时性非常差。请教下各位大侠,有没有好点的算法啊,各位做的网络通讯项目中是怎么处理的呢?最好是源码!谢谢!

解决方案 »

  1.   

    楼主,我想请教个问题:你是怎么在服务端给客户端发送存活包的,又是怎么回收的?如果确认客户端断线的话又要怎么样才能清掉socket中的记录(如果还有记录的话)?
    你的问题我不懂,但是我可能帮你一起找资料。先谢谢了!
      

  2.   

    存活包也就是SOCKET消息啊~不过是我指定的消息格式客户端的反馈包也是一样,客户端是在TIMER时间中统计该时间段内收到的包数客户,丢包超过一定的数量,就认为是断线了~因为服务端发送的存活包是很有规律的~~!至于清理ClientSocket,只要满足客户端在固定时间内反馈的消息包数没有达到一定比率服务端就认为该客户端已经断线了,也就是双验证的模式,服务端在固定时间内统计客户端的反馈包数,客户端则在固定时间内统计服务端的存活包数,满足一定的条件则认为是断线或依然联线。关键是发送存活包的频率。400个客户端,到底设定多少时间合适?目前实现起来就是及时性很差。因为我统计消息包的数量是在一个TIMER事件中统计的。也就是断线后还要经过这么一个统计时间才能确定客户端断线。以上是我的思路。所以我请教各位高手你们在处理存活包的时候是怎么处理的~!谢谢~~~希望你们已经明白我的意思了..
      

  3.   

    你可以把发送存活包的时间缩短,例如每一分钟发一次,另外统计也要缩短,例如没3分钟统计一次(相当于连续发三个包都没有回应的话,就认为断线了)
    这和CMPP2.0协议中的长链接类似,是这样的:6.1 长连接
        通信双方以客户-服务器方式建立TCP连接,用于双方信息的相互提交。当信道上没有数据传输时,通信双方应每隔时间C发送链路检测包以维持此连接,当链路检测包发出超过时间T后未收到响应,应立即再发送链路检测包,再连续发送N-1次后仍未得到响应则断开此连接。
        参数C、T、N原则上应可配置,现阶段建议取值为:C=3分钟,T=60秒,N=3。
        网关与SP之间、网关之间的消息发送后等待T秒后未收到响应,应立即重发,再连续发送N-1次后仍未得到响应则停发。现阶段建议取值为:T=60秒,N=3。
      消息采用并发方式发送,加以滑动窗口流量控制,窗口大小参数W可配置,现阶段建
    议为16,即接收方在应答前一次收到的消息最多不超过16条。
      

  4.   

    谢谢 postren(小虫)和 getit911(Windows转Linux中) ,先结帖!如果还有不懂再开帖找各位~~!