INDY控件 的TCPClient控件和TCPServer使用的时候碰到下面的问题:
TCPClient用来连接到服务器,可以发送数据,但是,不能主动接收TCPServer发来的数据,只能自己发一条,然后立即收一条。如果我用TCPServer,要广播一个消息,那客户端怎么接收啊?难道只能TCPClient主动发了命令后才能接收消息么?请做过的朋友,给予解答。如果有其他控件也可以提出来,但是不要说自己从头写一个,那样太费时间了。我需要的是客户端和服务器端连接上以后都可以主动收发消息。另外我客户端是在私网内的,所以请不要提出在客户端放一个服务端控件的想法,因为服务器不能连接到客户机的。只能由客户端去连接服务端。

解决方案 »

  1.   

    当然可以,通过Timer来处理ReadFromStack来评定是否有数据可读研究过Indy In Depth和Indy的VCL源码就知道的http://lysoft.7u7.net
      

  2.   

    那效率不是大打折扣?如果我的数据量居多,每秒很多包,普通的TIMER怎么处理的及?莫非要用高级的多媒体定时器?
      

  3.   

    我觉得应该有一个时间通知啊。还有一个问题,如果没有处理的包怎么办?丢掉么?我看了它有一个Timeout设置,那个是不是判断丢去包的时间?如果是,那么在Timeout时间没到之前,缓冲区被填满了怎么办?Indy Client设计的太不科学了吧。高人来说说。。
      

  4.   

    参考Indy例子Indy9Demos\Chatprocedure TfrmMain.BroadcastMessage( WhoFrom, TheMessage : String );
    var
      Count: Integer;
      List : TList;
      EMote,
      Msg  : String;
    begin
      Msg := Trim(TheMessage);  EMote := Trim(memEMotes.Lines.Values[Msg]);  if WhoFrom <> 'System' then
        Msg := WhoFrom + ': ' + Msg;  if EMote <> '' then
        Msg := Format(Trim(EMote), [WhoFrom]);  List := tcpServer.Threads.LockList;<-遍历所有以连接的客户端
      try
        for Count := 0 to List.Count -1 do
        try
    //发消息
          TIdPeerThread(List.Items[Count]).Connection.WriteLn(Msg);
        except
          TIdPeerThread(List.Items[Count]).Stop;
        end;
      finally
        tcpServer.Threads.UnlockList;
      end;
    end;