客户端断开连接后,套接字isClosed()返回false

Lahiru Chandima:

在我的Java应用程序中,我有一个TCP服务器,它将在我的应用程序中生成的数据发送到所有连接的客户端。对于每个新套接字,我创建一个新线程。以下是线程代码。

    public void run() {
        try {
            PrintStream printStream = new PrintStream(socket.getOutputStream(), true);
            while (true) {
                if (socket.isClosed()) {
                    break;
                }
                synchronized (DataSource.getInstance()) {
                    printStream.println(DataSource.getInstance().getData());
                    try {
                        DataSource.getInstance().wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

数据生成线程会DataSoure在有新数据可用时进行写操作并进行调用,notifyAll()以便处理连接套接字的所有线程醒来并将可用数据发送给客户端。

我的问题是,即使客户端断开连接,也socket.isClosed()返回true。因此,处理套接字的线程永远不会终止。

为什么会这样?客户端断开连接后如何退出线程?

斯特芬·乌尔里希(Steffen Ullrich):

TCP没有“断开连接”。对等方只能表明它不想再发送任何信息(发送FIN),但这并不意味着它不希望接收任何信息。另一端仅意识到尝试读取并获得RST后也不需要读取。

如果将“不想读”作为客户端关闭的指示(如果应用程序协议是这种方式,则可能会这样做),则可以通过简单地从套接字读取来测试对等方是否“断开连接”。然后,系统调用不返回任何错误,但返回0个字节,这意味着将不再有来自对等方的数据。在Java中,这种情况被转换为EOFException。

除此之外,套接字不会自动关闭-仅显式关闭。isClosed仅在套接字在本地端(而不是对等端)上显式关闭后,才返回true。并且isConnected也不会告诉您另一端是否“断开连接”,它只会告诉您另一端是否确实连接了对等端。

另请参见Java Socket API:如何判断连接是否已关闭?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

“在建立安全的TLS连接之前断开客户端网络套接字的连接”,节点10

Web套接字:无法在Internet断开连接上检测到客户端连接

断开与错误的客户端连接:客户端套接字写入错误:管道损坏-乘客5.0.2

Python 3.5.1-Asyncio-检查套接字客户端是否已断开连接

客户端断开连接后,我是否必须关闭服务器端的套接字?

客户端断开连接

C#客户端/服务器套接字在断开连接后将不会再次连接

C ++套接字客户端断开连接

套接字编程:客户端断开连接可使服务器挂起

套接字客户端有时会断开连接

在python套接字编程中建立连接后,如何获取客户端的ip地址?

如何在socket.io中的断开事件上获取断开连接的客户端的套接字ID

客户端<clientid>上的套接字错误,正在断开连接

建立安全TLS连接之前客户端网络套接字已断开连接Node.js v13.0.1

2分钟后,Python套接字客户端断开连接

断开node.js中以前的客户端socket.io套接字的连接

如何检测客户端何时与UDS断开连接(Unix域套接字)

Delphi 7-当客户端套接字突然断开连接时,如何删除Listview项目标题

客户端突然断开连接后,如何使服务器套接字保持活动状态?

检查PHP套接字服务器中的断开连接客户端

断开连接后,TCP客户端未重新连接

套接字客户端返回变量

套接字在传递给客户端类后断开/关闭

客户端套接字连接被拒绝

客户端断开连接后,C 套接字 TCP 服务器出现故障

当客户端被 IntelliJ 断开连接时,套接字输入流在 readLine 上持续返回 null

“在建立安全 TLS 连接之前客户端网络套接字已断开连接”- Neo4j/GraphQL

Flask-MQTT 在 uWSGI NGINX 上运行时在“客户端 <unknown> 上的套接字错误”后断开连接

套接字客户端断开连接后 Python 线程保持活动状态