在下一个检查之前,可能有新的用户登录或客户之间通过服务程序进行通讯等
在ServerSocket中,每个连接占用的Connection是不一样的。只要针对每个Connection做一个时间记录就可以了。这时的Connetions[i]可能是其它的客户了,让每个客户登录时发出一个ID信号就可以了.
还有,如果ServerSocket没有检测到客户端的断开,它是不可能让别的连接占用未被释放的Connection的。Connection被占用的唯一情况是:发生Socket错误或服务器主动与客户端断开连接后又有新的客户登录。
而ServerSocket肯定能够检测到这种情况的

解决方案 »

  1.   

    将clientsocket的clienttype设为ctblocking,将serversocket的servertype
      设为stThreadBlocking
    2.将clientsocket的host和port设为serversocket的IP和端口号
    3.自定义线程tdealthread:
      TdealThread = class(TServerClientThread)
      private
      protected
        procedure Execute; override;
      public
        thr:tserverclientwinsocket;
      end;
    4.在serversocket的serversocketgetthread事件中写入以下语句以便在接到clientsocket
      端请求时启动tdealthread线程:
      var
           myt:tdealthread;
      begin
           myt:=tdealthread.Create(false,clientsocket) ;
           myt.thr :=clientsocket;
           socketthread:=myt;
      end;
    5.在serversocket的procedure TdealThread.Execute中写入每次接到clientsocket请求
      时想要完成的动作,举例如:
      var
        mysockets:twinsocketstream;
        rcvbuffer:array[0..299] of char;
        sndbuffer:array[0..299] of char;
      begin
        mysockets:=twinsocketstream.Create (thr,20);
        mysockets.WaitForData (1000);
        mysockets.Read (rcvbuffer,300);//将client端数据取到rcvbuffer中
        //......数据处理,将要发往client端的数据放到sndbuffer中
        mysockets.WaitForData (1000);
        mysockets.Write(sndbuffer,300);
      end;
    6.在客户端需要向服务器端提出请求时,执行下面程序:
      var 
        myclientsockets:twinsocketstream;
        rcvbuffer:array[0..299] of char;
        sndbuffer:array[0..299] of char;
      begin
        clientsocket.active:=true;
        myclientsockets:=twinsocketstream.Create (clientsocket.socket,20);
        myclientsockets.WaitForData (1000);
        //......将要传送的数据放入sndbuffer中
        myclientsockets.write(sndbuffer,300);
        myclientsockets.WaitForData (1000);
        myclientsockets.read(rcvbuffer,300);//将serversocket发回的数据取到rcvbuffer中
        clientsocket.active:=false;
      end;
    基本框架就是这样了,当然别忘了打开serversocket.