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

标签 java networking sockets serialization

我正在用 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();

关于java - 关闭套接字和 ObjectOutputStream 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/654117/

相关文章:

java - 国际化 JRE6 或 JDK6 或以 "cp037"编码方案读取文件

java - 如何获得要打印的总页数?

java - 编写测试器类来测试编译后的文件

java - Spring Data JPA 和 Exists 查询

c# - Web服务: How to debug System.Net.WebException?

macos - docker-compose.yml 中的主机名无法在 Mac 上识别(但可以在 Linux 上运行)

c++ - 文件同步库

java - Android API 的客户端等待时间

c# - .NET 没有可靠的异步套接字通信吗?

C:使用 select() 写入新客户端