如何判断套接字是不是已断开连接(Java)[重复]

Posted

技术标签:

【中文标题】如何判断套接字是不是已断开连接(Java)[重复]【英文标题】:How to tell if a socket has been disconnected (Java) [duplicate]如何判断套接字是否已断开连接(Java)[重复] 【发布时间】:2013-12-31 07:45:26 【问题描述】:

我已经阅读了 several questions 关于堆栈溢出的内容,但没有一个为我提供了优雅的解决方案。

我知道在 Socket 上调用 isConnected()isClosed() 是没有用的,因为它返回本地连接状态(如果服务器已连接 - 如果客户端已连接,则不是我想要的)。

我也不能简单地调用if(socket.getInputStream().read()==-1)*,因为这只会说明到达流的末尾 (EOS) - 即客户端最近没有发送消息。但是,这根本不表示客户端已断开连接。

我正在考虑让客户端在关闭套接字之前向服务器发送一条消息,让它知道它正在断开连接,但我想知道我是否缺少更简单的解决方案 - 想知道连接状态远程套接字是一个相当普遍的愿望。谢谢。

*更不用说InputStream#read()是一个抽象方法,我使用DataInputStream作为数据读取方法(即readInt()、readByte()等)

【问题讨论】:

你完全误解了 EOS 的含义。这意味着对等方已断开或关闭连接。 DataInputStream 对象不会“回避”任何东西。你在弥补。它提供了更多的方法,期。额外的方法会抛出 EOFException。你也可以使用它。无论如何,你必须检测到它。 所以“流结束”并不意味着到达流的“结束”(因为流是连续的并且没有开始或结束),而是流具有“结束”?我忘了通过扩展FilterInputStream,DataInputStream继承了它的read()方法。至于 EOFException:“如果此流在读取所有字节之前到达末尾。” “到达终点”是连接断开了吗?谢谢 废话。流的结束是流的结束。文件流从文件的开头开始,到文件的结尾结束。 TCP 流在创建连接时开始,在对等方关闭连接或关闭连接时结束。当这种情况发生时,Java read() 返回 -1,readLine() 返回 null,所有其他 readXXX() 方法抛出 EOFException. 好吧,这就是我没有得到的。谢谢 【参考方案1】:

我正在考虑让客户端在关闭套接字之前向服务器发送一条消息,让它知道它正在关闭,

为什么?没有用。您将阅读此消息,而不是从 read() 获取 -1。后者就是你所需要的。 extra 您帖子中的read() 肯定是个坏主意,但读取消息的read 却不是。你需要它,你会从中得到 EOS。你不需要额外的信息来告诉你同样的事情。

【讨论】:

虽然在第二个问题上,EOS 并不意味着套接字已关闭,只是客户端最近没有向流发送任何消息(因为它没有,所以我会从我的问题中编辑它'我认为完全没有工作) 客户端发送的消息会被服务器正常读取,但它会有一个特定的语法来表示它的意思是“套接字正在关闭”。每次服务器收到一条消息时,它都会检查该消息是否是“特殊的”(如果它具有该语法)。这是我能想到的唯一解决方案。 @asaini007 这是不正确的。 EOS 表示对端已关闭连接,或至少将其关闭以进行输出。它与“最近没有向流中发送任何消息”无关。如果您正在阅读消息,则可以检测到 EOS 并对其做出反应。额外的消息不会增加任何内容。 谢谢,这回答了我的问题。我没有意识到 EOS 是我一直需要的。 现在我正在尝试按照您的建议使用 read() 方法,我记得我没有使用它的最初原因 - 它会阻塞直到数据可用。我一直在使用FilteredInputStream#available()>0 来规避这个问题 - 但我认为它无法检测到 EOS。

以上是关于如何判断套接字是不是已断开连接(Java)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

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

如何用C语言检测网络是不是连接上、已连接、已断开状态

java comm如何监听串口断开,或者有啥接口可以判断是不是连接状态

django 频道如何知道客户端已断开连接?

C语言关于socket中如何判断客户端是不是与服务器保持连接

C#检查套接字是不是断开连接?