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[...]
我读多线程它告诉我如何检测在服务器端失去联系,但没有发现任何的客户端或答案不适合我。
答
的问题似乎是VM。当用Manjaro Linux在我的笔记本电脑上进行测试时,一切都按照它应该在一开始时一样进行!
谢谢你的贡献。 :)
答
设置在插座上的读取超时,合适的持续时间,足以包括所有的正常传输,并赶上SocketTimeoutException.
从我的理解,如果服务器端侦听套接字仍然绑定,或者应用程序没有实际完全退出时崩溃,如果它有端口应该已被释放OS或子进程的服务器仍在运行。如果后者是真的,那么即使绑定它的进程已经终止,它仍然可以绑定端口,因为子进程仍在运行。你的服务器产生子进程吗?如果服务器实际已退出,则应通过尝试写入套接字客户端上的outputstream来收到异常。 – 2014-10-09 19:34:12
关闭服务器应用程序后,Windows上的Netstat不显示任何连接。所以我猜这个港口不再受限制了,对吗? 另外,是的,我通过javafx为每个新连接产生一个子线程/任务。 – blkchockr 2014-10-09 19:56:33
@blkchockr当有数据要发送时,Windows [可以保持连接打开](http://superuser.com/a/217353/156822)。你测试过Linux-Linux吗? – nemo 2014-10-09 20:35:54