假如我用indy做一个 即时通讯的程序,服务器端维护一个在线用户 列表,有新用户上线时,就加到这个列表里,然后服务器通知其他所有客户端新用户 上线。如果有用户 下线,就从这个列表里把这个用户 删除,通知其他所有客户端用户 下线。
如果客户端发送登出命令给服务器时,没有问题的,所有的客户端都可以收到下线数据。
假如由于网络异常时,客户端掉线,就无法通知其他客户端了。有人提出用心跳包,如果一定时间未收到某个客户端的心跳数据,就从在线用户 列表中删除他,并通知其他客户端。如果这样做的话,服务器是不是需要一个专门的线程来定时检查在线列表的活动状态呢?
这样每隔一段时间就要通过locklist的方式来锁定用户 列表,检查完成以后再unlocklist,这样会不会影响到服务器的效率?有什么 其他方法吗?
客户端发送心跳数据是不是需要自己手工来写?

解决方案 »

  1.   

    自己写,百度 delphi 心跳
      

  2.   

    楼上等 于没说
    是DELPHI没落了,还是在坛子混的人,水平越来越低?
      

  3.   

    indy的socket通讯是这样,客户端连接服务器是,服务器在服务器端产生一个socket与客户端对应进行通讯,因此可以不采用额外locklist或轮询线程之类的东西。在idtcpserver的onexcute里面(这个代码是线程独立的,只针对当前特定的客户端连接)自己控制。比如你在这里可以采用一个定时器来控制。
    IdTCPServer1Execute(AThread: TIdPeerThread);
    begin
      在这里创建一个当前线程窗口用来注册定时器
      然后接收定时器发送心跳包以及相关的检测处理
    end;
    如果像lz说的那样要另起一个线程来轮询然后发心跳包,我觉得处理起来更复杂,因为设计线程同步和锁定的问题。
      

  4.   

    不用你来教训我吧?原来用过indy做过,不过都是短连接的。我只是想问一下indy有没有这种机制?
    用winsock来写的话,比这个要麻烦一些罢了
      

  5.   

    原来lz是大牛,失敬失敬。。您提的问题太高深了,csdn论坛已经没有具备这种解答能力的高手。还请大牛多多见谅。