我以前写了一个,几百个都没问题,自己在服务段写派生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;

解决方案 »

  1.   

    看清帮助,ThreadCacheSize是线程缓冲区的大小,即SERVERSOCKET先创建ThreadCacheSize个线程,当客户端有连接时不用新建线程,直接从这里取一个线程来响应,当连接数超过ThreadCacheSize数时,SERVERSOCKET就会新建线程了。
    所以要考虑这个值,太大,则一开始建太多线程,资源浪费,太小,则起不到CACHE作用。主要考虑实际应用中的并发用户数来取,一般10-20即可。
    至于线程数的极限,在98下只能建10-20个,超过有时会蓝屏,在NT/2000下我试过一千个线程没有问题。