Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未检测到Java套接字已关闭_Java_Sockets - Fatal编程技术网

未检测到Java套接字已关闭

未检测到Java套接字已关闭,java,sockets,Java,Sockets,我已经编写了一个小型服务器/客户端应用程序。这是密码 try { OutputStream os = clientSocket.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(os); System.out.println("clientsocketstatus connected: " + clientSocket.isConnected()); System.out.prin

我已经编写了一个小型服务器/客户端应用程序。这是密码

try 
{
   OutputStream os = clientSocket.getOutputStream();
   ObjectOutputStream oos = new ObjectOutputStream(os);   
   System.out.println("clientsocketstatus connected: " + clientSocket.isConnected());
   System.out.println("clientsocketstatus closed: " + clientSocket.isClosed());
   oos.writeObject(keepAliveNW); 
} 
   catch(Exception e) 
{ 
   e.printstacktrace(); 
}
现在,当我在Windows中禁用NIC并重新启用netstat时,我的PC1和PC2之间没有打开的连接。 现在,当我的客户机尝试发送keepAliveNW对象时,应该存在异常,但没有异常。我窃听了。服务器上没有数据。我还对客户进行了窃听。Keep-Alive数据包是发送的,但是从来没有任何TCP-ACK-Paket,所以Java应该检测出有什么地方出错了。当连接完全建立时,在保持活动的数据包之后会有一个TCP ACK数据包。 那么,我如何检测到连接已断开


谢谢您的帮助。

在发送保持活动段后,TCP将在未收到任何确认后重新传输,并且在收到足够的确认后,将向调用应用程序报告错误


通过发送仅触发ACK的0长度消息,可以确认非活动连接是否继续存在。这类似于某些平台上可用的操作系统级保持活动功能,但可以调整到应用程序所需的频率。

是的,我在Wireshark中看到一些重传,但即使在2分钟后,我也没有收到异常。我需要调用一些函数来获取错误吗?最后一段应该包含FSH和/或RST标志集,指示会话正在被中断。如果定期调用长度为0的段的send(),则它将失败,并出现套接字关闭异常。确保您有一个非缓冲写入程序-否则写入程序可能不会将请求转发到套接字,因为它似乎没有任何效果。无法在TCP中发送零长度消息。我不同意。底层传输是否会以用户级别keep-alive的形式发送消息可能是开放的,但接口肯定支持这一点。我的回答含糊不清,因为我没有检查JavaAPI是否提供了显式的保持活动,并建议使用空消息替代方案。OPs观察结果表明会话没有超时,没有任何错误。查看
write()
方法受“如果
off
为负,或者
len
为负,或者
off+len
大于数组
b
的长度,则抛出
indexootfboundsexception
”约束我没有看到任何阻止
len
为零的限制。
isConnected()
只是告诉您是否连接过此
套接字。
如果没有,您将无法获取输出流,因此
isConnected()
调用将无法访问。它不会告诉你连接是否仍然存在。类似地,
isClosed()
只告诉您是否关闭过此
套接字。
同样,您没有关闭,否则将无法获取输出流。它不会告诉您对等方是否已关闭。另外,您应该在套接字的生命周期中使用相同的
ObjectOutputStream
,而不是为每个keepalive创建一个新的。每次使用相同的ObjectOutputStream而不是创建一个新的ObjectOutputStream有什么好处?好处在于它可以工作。如果每次都使用新的ObjectInputStream,则必须在对等端相应地使用新的ObjectInputStream,并且很可能会使其不同步。每次我读取新对象时,我也会创建一个新的ObjectInputStream。所以它们不应该不同步,或者应该不同步?如果我在一侧重复使用ObjectOutputstreams,我会在第二个写入对象处得到一个“StreamCorruptedException:invalid stream header”异常。这似乎真的是Android在设备上的一个bug,因为它在模拟器上运行。