Java 关闭套接字和ObjectOutputStream的正确方法?
我正在用Java编写一个网络应用程序,以便在客户机和服务器之间进行通信。我正在使用序列化对象表示数据/命令,并通过对象输出/输入流发送它们 我在干净地关闭连接时遇到了问题,我假设我缺少了一些我并不真正了解的基本信息,我以前从未使用过带序列化的套接字 如果我尝试关闭连接(先关闭客户端,先关闭服务器),将引发Java 关闭套接字和ObjectOutputStream的正确方法?,java,networking,sockets,serialization,Java,Networking,Sockets,Serialization,我正在用Java编写一个网络应用程序,以便在客户机和服务器之间进行通信。我正在使用序列化对象表示数据/命令,并通过对象输出/输入流发送它们 我在干净地关闭连接时遇到了问题,我假设我缺少了一些我并不真正了解的基本信息,我以前从未使用过带序列化的套接字 如果我尝试关闭连接(先关闭客户端,先关闭服务器),将引发ConnectionReset异常。我无法捕获此异常,因为客户端在另一个线程中运行,而程序的其余部分则不断侦听消息,这必须完成,就像在Javasocket中一样。read()是一种阻塞方法 关闭
ConnectionReset
异常。我无法捕获此异常,因为客户端在另一个线程中运行,而程序的其余部分则不断侦听消息,这必须完成,就像在Javasocket中一样。read()
是一种阻塞方法
关闭用于发送对象的套接字的正确方法是什么?当另一端正在关闭套接字时,您可能不应该等待从套接字读取()。在一个好的网络协议中,客户端可以在关闭连接之前通知服务器它没有什么要写的(可能通过发送一个特殊的关闭字符)。您需要向侦听器(无论是客户端还是服务器,都无所谓)发送某种信号来停止侦听更多数据。下面是一个非常简单的例子:
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();
您可以通过TCP/IP协议实现自己的协议。使用此协议的数据包的头部分将表示不同类型的数据包,如连接数据包、数据包、关闭连接数据包等。
ObjectInputStream.readObject()
如果对等方已完成发送对象并关闭连接,则将抛出EOFEException
。您一定忽略了它。谢谢,我从没想过要通知我的程序退出,我猜TCP会这么做。我想正如Avi所说,我在关闭套接字时正在等待输入,通过提醒客户端,我可以告诉它停止等待输入。您不需要关闭ObjectInputStream
,文档告诉:关闭此套接字也将关闭套接字的InputStream和OutputStream。
也许可以帮助您。呃,不,他正在使用序列化。