【问题标题】:Java Socket: no Exception on remote FIN + ACK an local ACKJava Socket:远程 FIN + ACK 本地 ACK 无异常
【发布时间】:2015-01-23 23:52:40
【问题描述】:

谁能告诉我,如果远程套接字正在关闭并发送 FIN + ACK,为什么我不会得到异常? Wireshark 告诉我,收到 FIN + ACK 并由 OS 发送 ACK。

这是我的代码。我真的什么都试过了。

byte firstByte = (byte)instream.read();
if (firstByte == -1){
    return null;
}
byte[] bytes = new byte[instream.available() + 1];
bytes[0] = firstByte;
instream.read(bytes, 1, bytes.length - 1);

instream 属于 Socket.getInputStream(),outstream 属于 Socket.getOutputStream()。

我的 15 秒心跳将关闭连接。

【问题讨论】:

  • 套接字从另一侧关闭,您从这一侧从套接字读取的下一个操作只会告诉您没有什么可以从文件末尾读取。但是如果你从你身边关闭套接字并执行这个操作,它会给你一个异常,比如从一个关闭的文件中读取。您正在使用 InputStream,因此它隐藏了下面的内容(文件或套接字)并且对两者的行为方式相同

标签: java sockets ioexception


【解决方案1】:

远程机器关闭网络连接不是系统级错误。尝试从与代表已关闭连接的本地端的Socket 关联的InputStream 中读取将检测到文件结束条件,这对于任何Inputstream 来说都是很自然的可能性。

根据its docsInputStream.read() 在到达文件末尾时返回-1。对于网络套接字的InputStream,这是连接已关闭的相当可靠的指示。

您需要注意的是远程客户端在没有完全关闭连接的情况下断开连接。本地机器无法检测到这一点,并且尝试从此类连接的本地套接字读取将无限期阻塞。

【讨论】:

  • 是的。我试图读取-1,但没有正常工作。也许我做错了什么。不过谢谢大佬,我再试一次。
  • 请注意InputStream.read() 返回int。您应该这样阅读它以区分值-1255,当截断为byte 时,这两个值都会产生-1
  • 好吧,好吧。工作正常!显然我做错了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
相关资源
最近更新 更多