Java 关闭套接字和ObjectOutputStream的正确方法?

Java 关闭套接字和ObjectOutputStream的正确方法?,java,networking,sockets,serialization,Java,Networking,Sockets,Serialization,我正在用Java编写一个网络应用程序,以便在客户机和服务器之间进行通信。我正在使用序列化对象表示数据/命令,并通过对象输出/输入流发送它们 我在干净地关闭连接时遇到了问题,我假设我缺少了一些我并不真正了解的基本信息,我以前从未使用过带序列化的套接字 如果我尝试关闭连接(先关闭客户端,先关闭服务器),将引发ConnectionReset异常。我无法捕获此异常,因为客户端在另一个线程中运行,而程序的其余部分则不断侦听消息,这必须完成,就像在Javasocket中一样。read()是一种阻塞方法 关闭

我正在用Java编写一个网络应用程序,以便在客户机和服务器之间进行通信。我正在使用序列化对象表示数据/命令,并通过对象输出/输入流发送它们

我在干净地关闭连接时遇到了问题,我假设我缺少了一些我并不真正了解的基本信息,我以前从未使用过带序列化的套接字

如果我尝试关闭连接(先关闭客户端,先关闭服务器),将引发
ConnectionReset
异常。我无法捕获此异常,因为客户端在另一个线程中运行,而程序的其余部分则不断侦听消息,这必须完成,就像在Java
socket中一样。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。
也许可以帮助您。呃,不,他正在使用序列化。