本身是服务器端:当客户端连接3分钟内没有回应,自动关闭连接;并在此线程内处理所有客户端请求。请问怎么修正这段代码?代码如下:
{ TFileServerThread }TFileServerThread = Class(TServerClientThread)
public
  Procedure ClientExecute; override;
End;
procedure Tcommonfrm.SSGetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  // Create a new thread for connection
  SocketThread := TFileServerThread.Create(False, ClientSocket);
end;
Procedure TFileServerThread.ClientExecute;
var
  MsgHead:TMsgHead;
  mstream1:Tmemorystream;
  SocketStream: TWinSocketStream;
begin
  While Not Terminated And ClientSocket.Connected Do
  begin
    try
      SocketStream := TWinSocketStream.Create(ClientSocket, 180000);
      mstream1:=Tmemorystream.Create;
      mstream1.SetSize(ClientSocket.ReceiveLength);
      mstream1.Position:=0;
      if ClientSocket.ReceiveLength>0 then
      begin
      ClientSocket.ReceiveBuf(mstream1.Memory^,ClientSocket.ReceiveLength);      if mstream1.Read(MsgHead,sizeof(TMsgHead))<> 0 then
      begin
        case msghead.MsgType of
          1: commonfrm.ADDUser(mstream1,clientsocket);
          3: commonfrm.ReturnMSGOfAll(mstream1,clientsocket);
        end;
      end;
    finally
      mstream1.Free;
      SocketStream.Free;
    end;
  end;end;

解决方案 »

  1.   

    用外部定时器(轮),进行检测,每次接收或者发送时,重置关联计时器,定时器(轮)检测到超时(比如贴子当中说的3分钟),则closesocket(推荐的先使用shutdown,如果应用所要服务的连接数不是太多,比如10000以下,可以在下一轮超时时间里面,或者重新设置一个用来关闭socket的超时时间,再调closesocket).
      

  2.   

    放一个公用的列表,比如TList,因为这里涉及到多线程,建议使用TThreadList。开一个Timer,设置一定的间隔时间对该List进行描述,List当中放置的元素就是一个结构(例如下面的结构)的指针,连接上之后就申请一个结构并把指针添加到List,完了再从中删除,结构包含一个最后访问时间(发送和接收都对其进行时间重置),以及超时时间(这个可以是在外部配置文件当中配置的,可以不需要),另外一个就是TServerClientWinSocket:type
      MyStruct = packed Record
        LastAccess:TDateTime;
        TimeOut:Integer;//这个可以不用,或者自己根据情况,比如以秒或者毫秒为单位
        Client:TServerClientWinSocket;
      end;
      

  3.   

    Procedure TFileServerThread.ClientExecute;
    var
      MsgHead:TMsgHead;
      mstream1:Tmemorystream;
      SocketStream: TWinSocketStream;
    begin
      While Not Terminated And ClientSocket.Connected Do
      begin
          SocketStream := TWinSocketStream.Create(ClientSocket, 180000);
          mstream1:=Tmemorystream.Create;
          mstream1.SetSize(ClientSocket.ReceiveLength);
          mstream1.Position:=0;
          if ClientSocket.ReceiveLength>0 then
          begin
            ClientSocket.ReceiveBuf(mstream1.Memory^,ClientSocket.ReceiveLength);        if mstream1.Read(MsgHead,sizeof(TMsgHead))<> 0 then
            begin
              case msghead.MsgType of
                1: commonfrm.ADDUser(mstream1,clientsocket);
                3: commonfrm.ReturnMSGOfAll(mstream1,clientsocket);
              end;
            end;
          end
          else
          begin
              if not SocketStream.WaitForData(180000) then
              begin
                sleep(1);
                clientsocket.Close;
                Terminate;  
              end;
          end;
      end;
      mstream1.Free;
      SocketStream.Free;
    end;
    最后这样能实现。但是我觉得这样没点技术含量。非常谢谢你僵哥,我再尝试你的方法~~