【发布时间】: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. -
好吧,这就是我没有得到的。谢谢
标签: java sockets stream inputstream