我用TsocketServer做了一个socket服务程序,采用的是线程阻塞模式,这个程序的功能是接收客户端的socket信息,然后根据信息进行相应的处理,把处理结果返回给客户端。客户端少的情况下一切正常。为了测试这个服务器程序的性能,又做了一个测试程序,同时起几十个客户端,然后每个客户端不停的向服务器发送socket信息请求处理,这时问题就出来了,服务器程序中有些线程响应很快,但有个别线程响应的时间非常慢,客户端过很长时间才能收到服务器的处理结果,甚至根本收不到。如果逐渐手工结束一些客户端,减少到一定的程度,原先没有响应的客户端就能收到返回结果了。给我的感觉是当有客户端连接时服务器中分配一个线程的优先级不一样,那些响应慢的线程得不到足够的cpu时间,导致处理信息非常慢。但事实上服务器端起的每个线程优先级都一样(normal)。恳求各位大哥指点,该怎么样解决这个问题,我的程序要求时同时起几十个客户端然后不停的发信息给服务器,每一个客户端都能收到返回结果。收到结果的间隔时间肯定和客户端的连接数有关,间隔时间稍微长点没关系,但主要时确保每个客户端都能收到处理结果。
Procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
Var SocketThread: TServerClientThread);
Begin
// Create a new thread for connection
SocketThread := TMyServerThread.Create(false, ClientSocket);End;Procedure TMyServerThread.ClientExecute;
Var
Data: Array[0..2047] Of char;
RecText: String;
SocketStream: TWinSocketStream;
Begin
While Not Terminated And ClientSocket.Connected Do
Try
SocketStream := TWinSocketStream.Create(ClientSocket, 15000);
Try
FillChar(Data, SizeOf(Data), 0);
If SocketStream.Read(Data, SizeOf(Data)) = 0 Then
Begin
sleep(100);
End;
RecText:= Data;
If ClientSocket.Connected Then
Begin
if RecText<>'' then
begin
sleep(10);
ProcessData(RecText); //处理信息函数
end
else
//尝试发送数据,检测客户端是否连接着
ClientSocket.SendText(#10)
End;
Finally
SocketStream.Free;
End;
Except
on ESocketError do
begin
//showmessage(' socket err');
ClientSocket.close;
Terminate;
end;
End;
End;请高手帮忙诊断一下!