我以前写了一个,几百个都没问题,自己在服务段写派生TserverclientThread
procedure TMyThread.clientExecute;
var
WSStream:TwinsocketStream;
begin
FreeOnTerminate:=true;
Keepincache:=true;
while (not Terminated) and (clientsocket.Connected) do
begin
try
WSStream := TWinSocketStream.Create(ClientSocket, 10000);
try
fillchar(ReadBuffer,sizeof(ReadBuffer),0);
if WSStream.WaitForData(10000) then
begin
if WSStream.Read(ReadBuffer,sizeof(ReadBuffer))<>0 then
{ ClientSocket.Close
else }
begin
if StrPas(ReadBuffer)='last' then
Synchronize(addMemo);
if Strpas(ReadBuffer)='quit' then
begin
//fillchar(writebuffer,sizeof(writebuffer),0);
//writebuffer:='quit';
//WSstream.Write(writebuffer,sizeof(writebuffer));
clientsocket.Close;
end;
end;
end
else
begin
fillchar(writebuffer,sizeof(writebuffer),0);
writebuffer:='quit';
Fcount:=WSstream.Write(writebuffer,sizeof(writebuffer));
clientsocket.Close;
end;
finally
WSStream.Free;
//Terminate;
end;
except
// handleException;
clientsocket.Close;
end;
end;
end;
procedure TMyThread.clientExecute;
var
WSStream:TwinsocketStream;
begin
FreeOnTerminate:=true;
Keepincache:=true;
while (not Terminated) and (clientsocket.Connected) do
begin
try
WSStream := TWinSocketStream.Create(ClientSocket, 10000);
try
fillchar(ReadBuffer,sizeof(ReadBuffer),0);
if WSStream.WaitForData(10000) then
begin
if WSStream.Read(ReadBuffer,sizeof(ReadBuffer))<>0 then
{ ClientSocket.Close
else }
begin
if StrPas(ReadBuffer)='last' then
Synchronize(addMemo);
if Strpas(ReadBuffer)='quit' then
begin
//fillchar(writebuffer,sizeof(writebuffer),0);
//writebuffer:='quit';
//WSstream.Write(writebuffer,sizeof(writebuffer));
clientsocket.Close;
end;
end;
end
else
begin
fillchar(writebuffer,sizeof(writebuffer),0);
writebuffer:='quit';
Fcount:=WSstream.Write(writebuffer,sizeof(writebuffer));
clientsocket.Close;
end;
finally
WSStream.Free;
//Terminate;
end;
except
// handleException;
clientsocket.Close;
end;
end;
end;
所以要考虑这个值,太大,则一开始建太多线程,资源浪费,太小,则起不到CACHE作用。主要考虑实际应用中的并发用户数来取,一般10-20即可。
至于线程数的极限,在98下只能建10-20个,超过有时会蓝屏,在NT/2000下我试过一千个线程没有问题。