客户端窗体form1 的 Button1Click 动态产生 form2 ,form2每个对象窗体中有一个TIdTCPClient 对象负责SOCKET连接处理,大致代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
  form:Tform2;
begin
  form:=Tform2.Create(application);
  form.Show;
end;procedure TForm2.Button1Click(Sender: TObject);
var
  s:string;
begin
  try
    IdTCPClient1.Connect();
    s:=IdTCPClient1.ReadLn();
    while s<>'' do
    begin
      Memo1.Lines.Add(s);
      s:=IdTCPClient1.ReadLn();
      Application.ProcessMessages;
    end;
  finally
    IdTCPClient1.Disconnect;
  end;
end;
服务端中代码:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  s:string;
begin
  s:=formatdatetime('yyyy-MM-dd hh:mm:ss',now);
  AThread.Connection.WriteLn(s);
  sleep(500);
end;
现在问题:我想要在一个client上同时开N个form2对象,每个form2对象都能同时自主接收到来自server的数据,上面的示例程序没达到我要的效果,当我第二个form2启动接收数据后第一个fomr2就停止了接收数据,我想问我需要怎么处理才能达到我要的效果,是不是服务端还要特别处理什么?

解决方案 »

  1.   

    你要动态保存好TIdPeerThread这个线程,然后有数据触发的时候,你可以把这些保存的连接统统发一遍。这样就做到了呀!
      

  2.   

    你想要服务端怎么区分你的客户端,你新建的窗口里CLIENT IP和端口都一样
      

  3.   

    改用UDP,
    服务端固定端口号,客户端动态设置端口号,,每次客户端先给服务端发个登陆信息,这样服务端就可以根据你不同的端口来区分你的客户端
      

  4.   

    哈OK了,上面的客户端有点问题,因为上面只有一个主线程,在Application.ProcessMessages这里出了点问题,把消息挂起来了,陷入到一个while循环里面去了,当第二个form2执行while循环的时候,第一个创建的form2的ReadLn没机会执行了,把创建form2移到线程里创建就行了;浪费了20分  - -||