Java套接字延迟继续
我正在通过如下套接字发送ascii:Java套接字延迟继续,java,sockets,Java,Sockets,我正在通过如下套接字发送ascii: outputStreamWriter(s + (char) 13); outputStreamWriter.flush(); 在现场,flush()和通过网络发送的数据之间可能有10到30秒的延迟(使用wireshark进行验证) 为了测试插座连接,我使用以下方法: public final boolean isConnected() { try { socket.sendUrgentData(32); return true;
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时,延迟消失了
使用协议分析器,我注意到我发送的大块数据最终被标记为紧急数据,就像我发送用于测试套接字的单个字节一样。与直觉相反,大型紧急数据包最终会被延迟
有什么想法吗?
谢谢
Andrew您可以尝试关闭nagle(Socket.setTcpNoDelay()),但是此延迟通常高达40到200毫秒,具体取决于操作系统。我从未见过导致多秒延迟的东西(除了怀疑是原因的完整GC) 我正在通过如下套接字发送ascii:
outputStreamWriter(s + (char) 13);
outputStreamWriter.flush();
不,你不是。这段代码甚至都不会编译
为了测试插座连接,我使用
徒劳的。这不会测试套接字连接。它只是发送一些输出。它会遇到与写入输出相同的问题:套接字发送缓冲区、重试、超时、接收器的套接字接收缓冲区和接收窗口。它不会告诉你连接是否仍然良好。除了向连接写入和捕获IOExceptions之外,什么也做不到,这绝对不会发生在断开连接后的第一次写入上
以任意间隔发送空格的另一个问题是,接收者必须理解并忽略空格。是吗?对不起,我应该提到,我设置了tcpnodelay(true),但延迟仍然存在。+1:好的,唯一确定另一端正在接收您的数据的方法是让另一端发回指示它接收到的数据。接收器处理空间很好,我的isConnected()函数也工作得很好(除了以某种方式引入延迟之外)。对于小代码片段,我感到抱歉,但我在分类域中,只能重新键入未分类的代码。通过在发送实际消息之前发送带有sendUrgentData的字节,我能够检测套接字的故障(当引发IOException时),并在连接套接字时保存我的消息以备将来使用。