TIdTCPClient和TIdTCPServer的简单通信疑问:

dahai9825 2009-09-10 05:07:00
客户端窗体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就停止了接收数据,我想问我需要怎么处理才能达到我要的效果,是不是服务端还要特别处理什么?
...全文
92 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dahai9825 2009-09-10
  • 打赏
  • 举报
回复
哈OK了,上面的客户端有点问题,因为上面只有一个主线程,在Application.ProcessMessages这里出了点问题,把消息挂起来了,陷入到一个while循环里面去了,当第二个form2执行while循环的时候,第一个创建的form2的ReadLn没机会执行了,把创建form2移到线程里创建就行了;浪费了20分 - -||
sanguomi 2009-09-10
  • 打赏
  • 举报
回复
改用UDP,
服务端固定端口号,客户端动态设置端口号,,每次客户端先给服务端发个登陆信息,这样服务端就可以根据你不同的端口来区分你的客户端
sanguomi 2009-09-10
  • 打赏
  • 举报
回复
你想要服务端怎么区分你的客户端,你新建的窗口里CLIENT IP和端口都一样
chenjun_0312 2009-09-10
  • 打赏
  • 举报
回复
你要动态保存好TIdPeerThread这个线程,然后有数据触发的时候,你可以把这些保存的连接统统发一遍。这样就做到了呀!

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧