Indy的IDTCPServer在处理客户端数据的时候,
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
应该来说没个客户端是个独立线程(AThread),我通过IP来判端是谁的
数据来做相应的处理,比如Server现在要给10个客户端发很多个数据
包,每发一包都要等相应客户端应答返回相应的数据包,才能给这个
客户端发下一包,这时,会发生:
1、A客户端先开始处理,等B客户端开始处理时,A停了,开始处理B,等C开
始就开始不停的处理C,其他都停了,即使C处理完,其他也不会恢复
2、如果在收到某个客户端正确的包后要给它发下一包时做个延时,几个客户端
会同时处理一段时间,但最终都会停掉,不管延时多久(当然不可能在程序中
延时太长)
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
应该来说没个客户端是个独立线程(AThread),我通过IP来判端是谁的
数据来做相应的处理,比如Server现在要给10个客户端发很多个数据
包,每发一包都要等相应客户端应答返回相应的数据包,才能给这个
客户端发下一包,这时,会发生:
1、A客户端先开始处理,等B客户端开始处理时,A停了,开始处理B,等C开
始就开始不停的处理C,其他都停了,即使C处理完,其他也不会恢复
2、如果在收到某个客户端正确的包后要给它发下一包时做个延时,几个客户端
会同时处理一段时间,但最终都会停掉,不管延时多久(当然不可能在程序中
延时太长)
我需要的是server能给所有的client同时发数据包,怎么做?
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;
应该通过socket标识来判断
TIdPeerThread的哪个属性可以判断出来socket的唯一标识?
如果是socket的话,可以用Handle属性判断。
Ip:Port这个格式的http://lysoft.7u7.net
否则就会出现访问冲突,应该就是你的情况。
一般方法是线程读写前先LOCK了,读写完后再UNLOCK,在LOCKED期间,其他线程就访问不了,直到被UNLOCK为止。
当然其他线程访问该控件时也要使用LOCK的,因为不LOCK的话仍然可以直接访问,那就没意义了
TClientObj = class
Buffer:array of byte ;
thread:TIDPeerThread ;
end ;
AThread.Data :=TClientObj.Create ;
TClientObj(AThread.Data).Thread :=AThread ;....创建一个对像,AThread.Data指向它。。用它来保存客户端所有状态。。不必用IP来区分客户端.
用我的保证不会出现这个问题http://yafeisoft.nease.net/cn/download/yafei.zip