关于Socket的收发,我用Indy控件,有个处理方式要探讨! ( 积分: 100 )

  • 主题发起人 主题发起人 zhaoxueli
  • 开始时间 开始时间
Z

zhaoxueli

Unregistered / Unconfirmed
GUEST, unregistred user!
public
MyThread:TIdPeerThread;

//在IdTCPServer1的OnExecute事件中
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
MyThread:= AThread; //让公共变量获得该线程,以便在别处使用
end;


//可以使用MyThread
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread.Connection.WriteLn('test');
end;

问题是当有多个客户端接入时,本来MyThread是对应A客户端,正在操作数据,当B连入时
此时MyThread就变成对应B端了,那就会导致操作了一半的数据不再是和A而变成和B连接了
一般怎么处理?能否代码示例一下
 
public
MyThread:TIdPeerThread;

//在IdTCPServer1的OnExecute事件中
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
MyThread:= AThread; //让公共变量获得该线程,以便在别处使用
end;


//可以使用MyThread
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread.Connection.WriteLn('test');
end;

问题是当有多个客户端接入时,本来MyThread是对应A客户端,正在操作数据,当B连入时
此时MyThread就变成对应B端了,那就会导致操作了一半的数据不再是和A而变成和B连接了
一般怎么处理?能否代码示例一下
 
因为每有一个连接你就把thread付给MyThread变量,结果就是MyThread是最后接入的用户线程。感觉不是你这样用法,你这样用是有问题的,还是好好看看帮助吧。
 
Indy控件我没用过,但我用过TServerSocket和TClientSocket控件做过局域网考试系统,服务器可同时向几十台考试机发卷,也可同时接收考试机发送过来的答卷,速度很快。用不着自己去建立多线程,因为我使用的是非阻塞方式,TServerSocket会自动进行多线程处理。哪怕几十台机器同时向服务器交卷,也不会出现混淆与错乱。
 
zfs88:如果都能及时处理是可以,但我现在是把该对象用一个公共变量引出来用
就存在这个公共变量指向的问题了,因为公共变量只有一个
 
问题就出在你的公共变量只有一个的问题上,你应该搞一个列表,列表中的每一项包含socket连接,和这个连接对应的用户的数据。在往某一用户发数据时先在列表中找到该用户的连接,再通过连接发送数据。单一一个公共变量是不行的。
 
可以用Tlist建立一个TIdPeerThread的列表,我的应用就是这样做的。或者可以直接采用IdTCPServer中保存的连接列表。
 
接受答案了.
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部