我正在通过这样的套接字发送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时,延迟就消失了。
使用协议分析器,我注意到我发送的大块数据最终被标记为紧急,就像我发送给测试套接字的单字节一样。与直觉相反,大型紧急数据包最终会被延迟。
有什么想法吗? 谢谢, 安德鲁
答案 0 :(得分:3)
我正在通过这样的套接字发送ascii:
outputStreamWriter(s + (char) 13);
不,你不是。该代码甚至无法编译。
为了测试套接字连接我使用这个
徒劳的。这不会测试套接字连接。它只是发送一些输出。它只会遇到与写入输出相同的问题:套接字发送缓冲区,重试,超时,接收器的套接字接收缓冲区和接收窗口。它不会告诉您连接是否仍然良好。除了写入连接和捕获IOExceptions之外,没有什么可以做到的,这在断开连接后的第一次写入时肯定不会发生。
以任意间隔发送空间的另一个问题是接收方必须理解并忽略它们。是吗?
答案 1 :(得分:0)
您可以尝试关闭nagle(Socket.setTcpNoDelay())但是此延迟通常最多为40到200 ms,具体取决于操作系统。我从未见过会导致多秒延迟的事情(除了完整的GC,怀疑是这里的原因)