Java Socket Delay继续

时间:2011-09-21 11:19:13

标签: java sockets

我正在通过这样的套接字发送ascii:

outputStreamWriter(s + (char) 13);
outputStreamWriter.flush(); 

在现场外,flush()和通过网络发送的数据之间可能有10到30秒的延迟(使用wireshark验证)。

为了测试套接字连接我使用:

public final boolean isConnected() {
  try {
    socket.sendUrgentData(32);
    return true;
  } catch (IOException e) {
    return false;
  }

当我摆脱sendUrgentData并在isConnected()中返回true时,延迟就消失了。

使用协议分析器,我注意到我发送的大块数据最终被标记为紧急,就像我发送给测试套接字的单字节一样。与直觉相反,大型紧急数据包最终会被延迟。

有什么想法吗? 谢谢, 安德鲁

2 个答案:

答案 0 :(得分:3)

  

我正在通过这样的套接字发送ascii:

outputStreamWriter(s + (char) 13);

不,你不是。该代码甚至无法编译。

  

为了测试套接字连接我使用这个

徒劳的。这不会测试套接字连接。它只是发送一些输出。它只会遇到与写入输出相同的问题:套接字发送缓冲区,重试,超时,接收器的套接字接收缓冲区和接收窗口。它不会告诉您连接是否仍然良好。除了写入连接和捕获IOExceptions之外,没有什么可以做到的,这在断开连接后的第一次写入时肯定不会发生。

以任意间隔发送空间的另一个问题是接收方必须理解并忽略它们。是吗?

答案 1 :(得分:0)

您可以尝试关闭nagle(Socket.setTcpNoDelay())但是此延迟通常最多为40到200 ms,具体取决于操作系统。我从未见过会导致多秒延迟的事情(除了完整的GC,怀疑是这里的原因)