我正在用java写一个ftp服务器端的程序,但是现在我在如何处理超时上出现了一点小问题无法解决:
我首先有一个socket对象ctrlSocket用于接受客户端发来的命令:
String recvCommand = ctrlSocket.recvCommand();
我对这个socket设了超时5s,然后我在异常处理这里加入了这样的代码:
try{
    String recvCommand = ctrlSocket.recvCommand();
    //对于recvCommand的一些处理
    //.......
  }catch (SocketTimeoutException e) {
    // 超时处理
     try {
             ctrlSocket.sendResponse("421 Transfer Time out:closing control connection");
        } 
     catch (Exception ex) {ex.printStackTrace();}
} catch (IOException ex){
ex.printStackTrace();
} finally {
try {
ctrlSocket.close();
System.out.println("One thread terminated");
} catch (IOException e) {}
}我用cmd下的dos自带ftp命令来测试我的服务器端,当我5s内不做任何操作后再次输入命令时,只会显示
“Connection closed by remote host.”
而没有显示
“421 Transfer Time out:closing control connection”
但是我利用dos的ftp命令访问其他的服务器却可以显示出包含 “421” 的错误信息,我初步分析原因是我关了socket后客户端还没有接收到我发送的421信息(如果我不关ctrlSocket的话dos就会显示出421信息)。另外我如果在“ctrlSocket.close();”这句前面加入“recvCommand = ctrlSocket.recvCommand();”的话(即等待下一条指令),那么也会显示421信息,但是这样的话ctrlSocket还是可能会等待无穷的时间,我不知到如何能即关闭了ctrlSocket又能让客户端正确显示出421信息,请高手指点

解决方案 »

  1.   

    答:想问一下:ctrlSocket.sendResponse("421 Transfer Time out:closing control connection"); 
    中有没有及时用flush()刷空一下?
      

  2.   

    已经flush了,下为sendResponse方法定义private PrintWriter output;
    ......
    public void sendResponse(String response) {
    this.output.println(response);
    this.output.flush();
    }
      

  3.   

    我觉的缓冲区的问题不大,我个人认为有可能是try{}catch{}.....的问题