我想检查互联网什么时候关闭我可以捕获该事件。我没有得到正确的API或任何可以解释相同的例子。
我正在使用套接字进行(TCP)通信,并在网络可用时打开套接字。我观察到套接字在网络关闭的情况下不会给出任何异常。
如果有人做过或任何示例链接真的有用,请提前感谢
答案 0 :(得分:3)
问题是 tcp connections 中不存在“网络关闭”事件,它们只会停止运行。
根据Jerome的建议,您应该检查是否达到超时。
当然,如果网络出现故障,您将无法收到数据包,也无法发送它们,因此基础InputStream
和OutputStream
会抛出IOException
,但就在他们意识到的时候该网络无法正常工作(通常2*rtt = 120
秒,这取决于TCP层的管理方式)。
自己查看状态图:
通常情况下,当在 ESTABLISHED 时,您的套接字将在从目标等待 ACK 的同时通过套接字发送数据。自网络关闭以来, ACK 将不会出现,因此套接字的窗口会填满,套接字开始重新发送数据包,直到真正的超时干预抛出异常。
另一种情况是当网络关闭并且您的套接字意识到它不能再在通道上写入时:它会在调用outStream.write(...)
时立即抛出异常。
答案 1 :(得分:2)
判断网络是关闭还是放慢速度并不容易。
如果你设置超时,如果花费太长时间会抛出异常:
对于套接字:
socket.setSoTimeout(CONNECTION_TIMEOUT);
对于HttpURLConnections:
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECTION_TIMEOUT);
con.setReadTimeout(CONNECTION_TIMEOUT);
答案 2 :(得分:2)
TCP在空闲时设计为安静。没有待处理数据包时,网络上没有管理数据包。如果连接在空闲时死机,则无论超时设置如何,您都不会知道。它确实有keepalive但是在2小时或更长的推荐频率下它几乎没用。
您需要在应用程序协议中构建一些心跳或keepalive来检测过时的连接。 Keepalive只是一个定时发送的noop数据包,在连接断开时触发TCP超时。在我的应用程序中,我每10秒钟执行一次。
答案 3 :(得分:0)
为什么不尝试ping www.google.com
请参阅http://java.sun.com/j2se/1.5.0/docs/guide/nio/example/Ping.java