我这个程序是由服务端和客户端组成的,现在我想在服务端实现对客户端的侦听,以确定客户端是否在线。
具体实现是,在服务端做了一个线程以向所有客户端发送消息。如果有10个用户,并且都在线,那么我需要等待这10个在线用户的回应消息都返回了,我认为一次侦听操作完成;那么如果只有前5个用户在线,而后5个用户不在线,但这个时候服务程序是不知道的,那么服务程序在向所有客户端发完消息后,在线用户会返回消息,离线用户肯定返回不了,在服务程序中如何判断已经接收完在线用户的回应消息呢?以完成一次侦听。
因为UDP是没有确认消息返回的,所以我只能用这种方法来实现。问题就出在我如何知道所有在线用户的回应消息已经发完。我现在是在服务接收中做了一个记数器,每接收一个就加1。然后用另一个线程去监视这个记录数器,当在一定时间内记数器没有变化,我就认为接收消息完毕。还有什么好的方法吗?不知道说清楚没有。

解决方案 »

  1.   

    让client向server发送消息,您 好像整倒了。
      

  2.   

    个人觉得你客户端向服务器端发送消息。。然后你服务器上页不用开辟线程去侦听了。。只要用户上线了自动的向服务器发送消息。。服务器记录下来存起来就OK。。不知道对不起。。阳痿UDP协议的没弄过。。
      

  3.   

    楼主试试这个SDK看看:http://www.anychat.cn/faq/,也是聊天的,里面有demo程序可供参考的。
      

  4.   

    C每过些时间发送信息给S。以确定C是否在线。如果超过这个时间C没发信息给S那S就认为C以下线。
      

  5.   

    一般无连接的都是通过心跳包来监听的,Server管理好每个用户的状态,然后把刚离线的发送给需要通知的Client,Client再做处理
      

  6.   

    发消息前先测试一下所有的客户端(用ping),这样就知道有多少在线客户,然后统计接受到的回应消息数是否等于这个在线客户数
      

  7.   

    在服务器端建立一个事件委托,每次只要有客户端上线,就订阅这个委托事件。想知道有多少人在线,只要查一下这个事件有多少订阅就知道了。下线的时间就注销掉。
    具体可以参考Remoting的广播看一下。
      

  8.   

    其实楼上的下线注销应该是正常程序下线,而无法处理掉线的意外情况,我在UDP通信中都是制定一个握手命令,客户端接受到该命令后马上返回相对应的命令,然后用延时来判断意外掉线。
      

  9.   

    如果是正常下线,则只要客户端主动通知服务端就行了,意外离线则无法得知,没有应答有多种可能
    服务程序不可能知道何时收完所有客户端的应答消息,如果知道的话,就说明你已经知道哪些在线哪些不在线了
    一次侦听的完成不可能以收到全部应答为完成,而只能是以一段时间为一次,这段时间内没有收到应答的就认为是离线了,为防误判,可以以连续若干次timeout为判断条件客户端向服务器端发送消息则是以固定时间间隔发送消息,连续若干个时间间隔没有收到某客户端的消息则认为是离线了