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

时间:2009-03-17 12:59:02

标签: java networking sockets serialization

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

我在干净地关闭连接时遇到问题,我认为我遗漏了一些我根本不了解的基本内容,我以前从未使用过带有序列化的套接字。

我尝试关闭连接的任何命令(先关闭客户端,先关闭服务器)会引发ConnectionReset异常。我无法捕获此异常,因为客户端在另一个线程中运行到程序的其余部分,不断地监听消息,这必须完成,因为在Java socket.read()中是一种阻塞方法。

关闭我用来发送对象的套接字的正确方法是什么?

4 个答案:

答案 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协议实现您的协议。使用此协议的数据包的标头部分将表示不同类型的数据包,如连接数据包,数据包,紧密连接数据包等。