1——
在CS模式的应用系统中,SERVER端如何检测到CLIENT已经断开?比如CLIENT的应用关闭了、网络断开了等等2——
在CS模式中,CLIENT可能被动的接收SERVER的消息,比如QQ的广播消息,也就是说,SERVER在可能的情况下,需要向每个存在的连接发送一个广播数据,这个时候,CLIENT如何检测到有数据可以接收?

解决方案 »

  1.   

    1.可以让c每隔一段时间给s发送一个消息,表示在线2.我觉得可以让数据库来实现这个功能,就和离线消息一样的做法,把消息存在数据库里
    让c自己来向s要消息
      

  2.   

    (1)可以想一楼那样使用心跳包。
    (2)QQ应该不仅仅是个客户端,它同时也开端口监听服务的。登陆过程中,它是个客户端,登陆成功后,它会告诉服务器自己监听的IP和端口。而腾讯的服务器会把这个地址和端口告诉你的每一个好友,以后你和好友的通信就不必经过腾讯的服务器了,否则腾讯的服务器未必能受得了那么大的通信压力。所以,QQ通信的各方实际上是互为服务器和客户端。
      

  3.   

    谢谢回复!1——
    这个问题想到了,感觉这样总怪怪的,但可以作为不是办法的办法。2——
    这个问题是基于这样的想法提出的:
    在CS系统中,各CLIENT都会更新数据,当某个CLIENT更新了某个关键的数据的时候,希望其它的所有CLIENT都能同步获得这个数据,避免其它的CS又进行更新或者能使用到更新的数据。如果采取CLIENT定时向SERVER请求虽然能解决,但对网络是否会造成带宽浪费?
      

  4.   

    (1)本来就没有办法的,你可以试一下,连接建立后,拔掉网线,通信双方未必马上知道的。
    (2)可以建立连接,然后客户端等待服务器的通知消息啊。指定具体一点的通信协议,用不同的标记区分各种不同的通信包就是了。比如Upload包,Update包
      

  5.   

    (2)QQ应该不仅仅是个客户端,它同时也开端口监听服务的。登陆过程中,它是个客户端,登陆成功后,它会告诉服务器自己监听的IP和端口。而腾讯的服务器会把这个地址和端口告诉你的每一个好友,以后你和好友的通信就不必经过腾讯的服务器了,否则腾讯的服务器未必能受得了那么大的通信压力。所以,QQ通信的各方实际上是互为服务器和客户端。我对这个观点还是有些看法,腾讯的服务器现在应该已经是实现分布式了,所以从某种意义上来说腾讯的服务器是可以承受很大的通信压力的,现在的qq客户端也不能说是有服务器的功能,只是采用了一个很好的通信的做法罢了,我觉得qq的通信应该是先采用点对点,如果不行就通过服务器中转,协议是先采用udp,如果连接超时就改用tcp
      

  6.   

    To楼上:是这样的。
    我们可以接受到好友以前发送的消息,这就说明存在服务器中转。
    我只是想说明:QQ不仅仅是个客户端。:)
      

  7.   

    s检测c有否断线可以用TCPlistener,但s发数据到c就知如何是好了!
      

  8.   

    如果要保持大量的tcp连接,肯定不能让客户端一直连着服务端,用完就断,要用再连
      

  9.   

    回复人: superfishmanweb  
    s检测c有否断线可以用TCPlistener,但s发数据到c就知如何是好了!
    既然要让c每隔一段时间要去连s,还会找不到办法吗?其实要深入研究,应该还有其他很多方法可以做到的