1:TServerSocket是不是本身就带线程,如果客户端500个连接时,服务端要不要开线程。
2:我服务端之前为stNonBlocking,向客户端发送命令时能立刻返回。但目前只有一个客户端,并且约定每个客户端隔15秒就发
送一个心跳包来服务端,所以我就担心当客户端有500多个时,要不要另开线程来做。
我现在写了段线程程序,但发现数据收到很慢,不知是怎么回事?Type
ServerThread=Class(TServerClientThread)
Private
Protected
Public
Procedure ClientExecute;Override;
End;Procedure ServerThread.ClientExecute;
Var
intI,intN:Integer;
Buff1:Array[0..1023] Of Byte;
S:String;
Begin
FreeOnTerminate:=True;
Try
While (Not Terminated) And (ClientSocket.Connected) Do
Begin
Try
S:='';
intN:=ClientSocket.ReceiveLength ;
ClientSocket.ReceiveBuf(Buff1,intN);
For intI:=0 To intN-1 Do
S:=S+Int2Hex(Ord(Buff1[intI]),2);
//If S<>'' Then
// MessageBox(application.Handle,Pchar(s),'提示',MB_ICONINFORMATION+MB_OK);
If ((S<>'') And (S<>'FE0300000003FD') And (Copy(S,7,2)='00')) OR (Copy(S,5,2)='0D') OR
(Copy(S,5,2)='0E') Or (Copy(S,5,2)='0F') Then
addcmd.Add(s);//addcmd为TStringList,增加一些返回命令,比如设置灯的状态,然后客户端返回信息
If S='FE0300000003FD' Then
Begin
ClientSocket.SendBuf(Buff,intN);
End;
Except
ClientSocket.Close;
Terminate;
End;
End;
Except
ClientSocket.Close;
Terminate;
End;End;
procedure TmainFrm.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=ServerThread.Create(False,ClientSocket);
end;知道的朋友帮我改进下.
2:我服务端之前为stNonBlocking,向客户端发送命令时能立刻返回。但目前只有一个客户端,并且约定每个客户端隔15秒就发
送一个心跳包来服务端,所以我就担心当客户端有500多个时,要不要另开线程来做。
我现在写了段线程程序,但发现数据收到很慢,不知是怎么回事?Type
ServerThread=Class(TServerClientThread)
Private
Protected
Public
Procedure ClientExecute;Override;
End;Procedure ServerThread.ClientExecute;
Var
intI,intN:Integer;
Buff1:Array[0..1023] Of Byte;
S:String;
Begin
FreeOnTerminate:=True;
Try
While (Not Terminated) And (ClientSocket.Connected) Do
Begin
Try
S:='';
intN:=ClientSocket.ReceiveLength ;
ClientSocket.ReceiveBuf(Buff1,intN);
For intI:=0 To intN-1 Do
S:=S+Int2Hex(Ord(Buff1[intI]),2);
//If S<>'' Then
// MessageBox(application.Handle,Pchar(s),'提示',MB_ICONINFORMATION+MB_OK);
If ((S<>'') And (S<>'FE0300000003FD') And (Copy(S,7,2)='00')) OR (Copy(S,5,2)='0D') OR
(Copy(S,5,2)='0E') Or (Copy(S,5,2)='0F') Then
addcmd.Add(s);//addcmd为TStringList,增加一些返回命令,比如设置灯的状态,然后客户端返回信息
If S='FE0300000003FD' Then
Begin
ClientSocket.SendBuf(Buff,intN);
End;
Except
ClientSocket.Close;
Terminate;
End;
End;
Except
ClientSocket.Close;
Terminate;
End;End;
procedure TmainFrm.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=ServerThread.Create(False,ClientSocket);
end;知道的朋友帮我改进下.
欢迎博士,帮我看看吧,谢谢了。
还有一个问题是,当我在关闭服务端程序窗口时,要等半天才能关闭,我想是上面的线程循环导致的。怎么才能立即关闭服务端程序呢?感觉疑问太多了,请高手耐心解答