【问题标题】:DataInput: Bytes lost over TCPDataInput:通过 TCP 丢失的字节数
【发布时间】:2024-01-18 09:33:01
【问题描述】:

我正在通过

发送数据
data.writeInt()

其中 Data 是一个 DataOutput,它有一个套接字的输出流。

在另一端,我有一个套接字的 InputStream 和一个 DataInput,我读取的是

data.readInt()

我已经确认每次写入都与适当的读取相匹配。然后我用wireshark查看包,一切都在那里。

但是,当我发送 17 时,我得到了 1114112。这移动了 2 个字节,所以我有可能在某处丢失两个字节吗?

我做了一些添加flush()的实验,但问题仍然存在。此外,我还没有(还)设法编写一个显示问题的较小示例(这就是为什么我不在这里包含代码的原因)。然而,大例子是稳定的,它每次都发生在同一个位置。

使用不同的数据,我在 17 之后得到 285212672(应该是 0)。这看起来像 17 的最后一个字节被读取了两次。

任何想法这可能是什么或建议如何调试它?

亚历克斯

【问题讨论】:

标签: java sockets tcp datainputstream


【解决方案1】:

我已确认每次写入都与相应的读取匹配。

显然情况并非如此。重新检查。显然,您与发件人不同步。例如,您可能正在使用read(),而您应该使用readFully()

NB TCP 不会丢失数据。

这被移动了 2 个字节,所以我有可能在某处丢失了两个字节吗?

可以肯定:“某处”在您的代码中。

我做了一些添加flush(), 的实验,但问题仍然存在。

只在意料之中。没有理由让flush() 有所作为。

此外,我还没有(还)设法编写一个显示问题的较小示例(这就是为什么我不在这里包含代码的原因)。然而,大例子是稳定的,它每次都发生在同一个位置。

这也是意料之中的事。您有一个应用程序协议错误。

【讨论】:

  • 问题是:
  • 一些第三方库在没有记录的情况下使用了线程。所以我期望的单线程实际上是多线程的。 DataInput 不是线程安全的。一些设计更改让我能够利用第三方库的多线程,所以现在一切正常。
最近更新 更多