Java在客户端检测与服务器的断开

问题描述:

我制作了一个具有客户端和服务器端的Java应用程序。双方通过套接字进行通信。这个效果很好,直到我的服务器应用程序被某些事情杀死,并且无法关闭或关闭serversocket。Java在客户端检测与服务器的断开

客户端似乎没有注意到断开的连接,只是在尝试读取下一个对象时挂起。

我也试着每隔5秒从客户端发送一个测试对象来检测服务器是否脱机,但这也不起作用。

我可能不得不说这只发生在运行Windows上的服务器应用程序和Linux上的客户端(Ubuntu VirtualBox中)时。 Windows-Windows工作正常。尽管我已经杀死了服务器,但Netstat甚至给了我一个建立在Linux上的ESTABLISHED。

客户端代码:

requestSocket = new Socket("192.168.1.3", 1234); 
out = new ObjectOutputStream(new CipherOutputStream(requestSocket.getOutputStream(), ec)); 

in = new ObjectInputStream(new CipherInputStream(requestSocket.getInputStream(), dc)); 

new Thread() { 
    public void run() { 
     while(true) { 
      try { 
       out.writeObject(obj); 
       out.flush(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("sent"); 
      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) {} 
     } 
    } 
}.start(); 

Server代码:

serverSocket = new ServerSocket(1234); 
socket = serverSocket.accept(); 
out = new ObjectOutputStream(new CipherOutputStream(clientSocket.getOutputStream(), ec)); 
in = new ObjectInputStream(new CipherInputStream(clientSocket.getInputStream(), dc)); 

//do-while-reading on the socket[...] 

我读多线程它告诉我如何检测在服务器端失去联系,但没有发现任何的客户端或答案不适合我。

+1

从我的理解,如果服务器端侦听套接字仍然绑定,或者应用程序没有实际完全退出时崩溃,如果它有端口应该已被释放OS或子进程的服务器仍在运行。如果后者是真的,那么即使绑定它的进程已经终止,它仍然可以绑定端口,因为子进程仍在运行。你的服务器产生子进程吗?如果服务器实际已退出,则应通过尝试写入套接字客户端上的outputstream来收到异常。 – 2014-10-09 19:34:12

+0

关闭服务器应用程序后,Windows上的Netstat不显示任何连接。所以我猜这个港口不再受限制了,对吗? 另外,是的,我通过javafx为每个新连接产生一个子线程/任务。 – blkchockr 2014-10-09 19:56:33

+0

@blkchockr当有数据要发送时,Windows [可以保持连接打开](http://superuser.com/a/217353/156822)。你测试过Linux-Linux吗? – nemo 2014-10-09 20:35:54

的问题似乎是VM。当用Manjaro Linux在我的笔记本电脑上进行测试时,一切都按照它应该在一开始时一样进行!

谢谢你的贡献。 :)

设置在插座上的读取超时,合适的持续时间,足以包括所有的正常传输,并赶上SocketTimeoutException.

+0

这对我来说不是一个真正的选择,因为输入通常是在服务器应用程序上进行的。由于这种方案,我需要与服务器保持连接,并尽快在丢失时重新连接。 – blkchockr 2014-10-10 14:35:09

+0

好的,所以如果你只写了,就赶上'IOException'并把它当作连接被洗掉的信号。唯一'IOException'不意味着'SocketTimeoutException'。 – EJP 2014-10-13 09:29:34

+0

我的问题是我根本没有得到任何异常。然后小溪在阅读时把自己吊起来,没有注意到再也没有关系了。 – blkchockr 2014-10-13 10:22:10