我正在用Java编写网络应用程序,在客户端和服务器之间进行通信我正在使用序列化对象来表示数据/命令并通过对象输出/输入流发送它们。
我在干净地关闭连接时遇到问题,我认为我遗漏了一些我根本不了解的基本内容,我以前从未使用过带有序列化的套接字。
我尝试关闭连接的任何命令(先关闭客户端,先关闭服务器)会引发ConnectionReset
异常。我无法捕获此异常,因为客户端在另一个线程中运行到程序的其余部分,不断地监听消息,这必须完成,因为在Java socket.read()
中是一种阻塞方法。
关闭我用来发送对象的套接字的正确方法是什么?
答案 0 :(得分:9)
你需要发送你的监听器(无论是客户端还是服务器,无所谓)某种信号来停止监听更多数据。这是一个非常简单的例子:
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(sock.getInputStream()));
while (true) {
Object obj = ois.readObject();
if (obj instanceof String) {
if ((String)obj).equalsIgnoreCase("quit")) {
break;
}
}
// handle object
}
ois.close();
sock.close();
答案 1 :(得分:2)
你可能不应该等待从套接字读取(),而另一端正在关闭它。在良好的网络协议中,客户端可以在关闭连接之前通知服务器它没有更多要写的内容(可能通过发送特殊的关闭字符)。
答案 2 :(得分:0)
ObjectInputStream.readObject()
将抛出EOFException
。你必须忽略它。
答案 3 :(得分:-1)
您可以通过TCP / IP协议实现您的协议。使用此协议的数据包的标头部分将表示不同类型的数据包,如连接数据包,数据包,紧密连接数据包等。