DatagramChannel.receive()似乎缓冲了数据包

时间:2015-11-01 14:46:55

标签: java udp

我有一台服务器每隔~50毫秒向我的客户端发送40字节的UDP数据包。客户端通常在大多数时间接收这些数据包。但是,每隔约1-3秒,没有数据包到达约500毫秒,然后在此之后的后续数据包到达0毫秒延迟,就像数据包被缓冲一样。

以下代码在一个单独的线程中调用,其唯一目的是接收数据包:

public synchronized int readUdp(DatagramChannel channel) throws IOException {
    InetSocketAddress sourceAddress = (InetSocketAddress) channel.receive(in);
    bytesRead = in.position();
    in.flip();

    // Read data out of buffer...
}

以下是我的调试结果的一些注释:

  • 服务器与客户端在同一台计算机上运行,​​但通信只是一种方式(服务器 - >客户端)。所有流量都从 127.0.0.1 变为 127.0.0.1 ,因此没有网络干扰。
  • 使用 RawCap 我查看了数据包及其时间,没有看到奇怪的数据,捕获数据包之间的所有增量时间都 ~50ms
  • DatagramChannel处于阻止模式。
  • 客户端也同时使用 TCP 连接到服务器,但没有在该频道上主动发送数据包。
  • 存储数据包的缓冲区是ByteBuffer,容量 1024字节
  • 调用channel.receive(in)之前缓冲区的位置始终为 0
  • 调用channel.receive(in)后缓冲区的位置始终为 40。
  • 数据包被读取并再次到达相同代码部分后的时间是〜0ms 。因此,我们可以得出结论,channel.receive(in)有时会 ~500ms
  • 只能从一个地方调用 readUdp 功能。

典型的故障如下:

Time: 49
Time: 51
Time: 49
Time: 51
Time: 307
Time: 0
Time: 0
Time: 0
Time: 0
Time: 1
Time: 41
Time: 51
Time: 49

如果有人能用一双新鲜的眼睛来检查这一点,我将非常感激。我能找到的唯一一个近距离案例是:http://www.coderanch.com/t/476539/Android/Mobile/UDP-DatagramSocket-receive-glitches。我的代码不会以任何方式与Android交互。我应该注意。

0 个答案:

没有答案