各位大侠帮忙,indy如何在delphi网络编程中控制多各客户端,当有多个客户端相连时,如何得到多个客户端ip,如何更据客户端的不同由服务器发送命令,再此过程中所有的客户端都要保持连接状态(我编的是一个网络抄表系统测试程序,客户端为多个采集器)?,如果有高手能用其他控件做到也可以,谢了

解决方案 »

  1.   

    TIdTCPServer 等的 Indy 服务控件都是多线程的。每个客户端 Connect 上来知道,都再服务端触发 OnConnect 事件,并产生一个线程对象(TThread 的继承类 TIdPeerThread)。
    如下面代码就可以得到客户端的 IP 地址。
    procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
    begin
      ShowMessage(AThread.Connection.Socket.Binding.PeerIP);
    end;每个 TIdTCPServer 会通过 Threads 属性维护一个 TThreadList,可以通过如下代码给每个客户端发送数据。(可以通过客户的 IP、Port 进行直接区分,或用 Data 属性)
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Index:   Integer;
      Threads: TList;
    begin
      Threads := IdTCPServer1.Threads.LockList;
      for Index := 0 to Threads.Count - 1 do
      begin
        TIdPeerThread(Threads.Items[Index]).Connection.WriteLn('Send To ' + IntToStr(Index));
      end;
      IdTCPServer1.Threads.UnlockList;
    end;要维持每个客户的连接,则必须定期发送数据来保持连接(如 3 分钟),可以从客户端发起也可以从服务端发起。
    由于 Indy 的客户端采用阻塞方式设计的,所最好采用客户端主动的应答方式进行编程。