本帖最后由 tjs_125 于 2013-08-20 19:31:49 编辑

解决方案 »

  1.   

    我刚才看了indy demo中的chat例子,里面是先在tcpServerConnect的事件里面把每一个连接上来得客服端都记下来,并保存在一个Clients里面(相当于客户端的管理列表),然后需要向某个已连接的客服端发送数据时,可遍历这个Clients,找出需要的客服端,然后 可以向下面这样发送消息
    Client := Clients.Items[Index];
    TIdPeerThread(Client.Thread).Connection.WriteLn(Msg);
    不知道行不行?
      

  2.   

    或者参考里面的广播消息函数的代码,如下:
    BroadcastMessage
    procedure 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;
      

  3.   

    记录链接ip, 链接端口, 链接线程编号。发送前区别当前链接是否有相同的ip, peer等,如果有就调用出来,发送内容。
      

  4.   

    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;这一段是向所有的链接发送信息。