用delphi中的socket控件怎样实现多客户的数据交流,要在服务器端发送数据到指定客户端!

解决方案 »

  1.   

    去indy主页下载 的DEMO 其中含有一chat目录下代码,估计是你要的.实例是一个主机,多个客户
      

  2.   

    serverSocket 有個 connections[i] 就可以分辨當前的每個用戶
    clientSocket 一次只能邊一個端口
      

  3.   

    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 的客户端采用阻塞方式设计的,所最好采用客户端主动的应答方式进行编程。
      

  4.   

    请问 zhengcg(楚楚): “客户端主动的应答方式进行编程”,能不能举个例!  (等会给分,谢谢各位的帮忙。)
      

  5.   

    意思就是从客户发送出一个命令如:
    IdTCPClient1.SendCmd('search myname');
    这个函数就会等待服务起的应答的(或超时),接着就可以用类似:
    IdTCPClient1.ReadLn();
    去读取应答了,IdTCPClient 没有比较好的事件通知机制的(就是等待服务器主动发送这种方式)。Web Client 的编程思想都是这样的,只是 Client 端是多线程而已。如果全部是文本的传送,或许你可以看看这个 TIdIRC、TIdIRCServer(一套基于TCP的聊天室协议),他们有很多附带功能,但是你可以不用,可以很方便。