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;知道的朋友帮我改进下.

解决方案 »

  1.   


    欢迎博士,帮我看看吧,谢谢了。
      

  2.   

    分阻塞式和非阻塞式,阻塞式就要等到结果才继续执行,所以有可能出现假死现象
      

  3.   

    楼上高手们,请帮我解答第一,第二个问题.我上面这段线程代码有什么问题?帮我改进改进。
    还有一个问题是,当我在关闭服务端程序窗口时,要等半天才能关闭,我想是上面的线程循环导致的。怎么才能立即关闭服务端程序呢?感觉疑问太多了,请高手耐心解答