开发者

Network listener in Java

开发者 https://www.devze.com 2022-12-13 10:11 出处:网络
I want to check when the internet goes off can i capture that event .I am not getting the proper API or any example which would explain the same .

I want to check when the internet goes off can i capture that event .I am not getting the proper API or any example which would explain the same .

I am using socket for (TCP)communication and I open a socket when the network is available. I have observed that the socket does not give any exception in case the network goes off.

If any one had done or any e开发者_如何学Pythonxample links would be really helpful Thanks in advance


The problem is that no event 'network down' exists in tcp connections, they just go down.

As suggested by Jerome you should check if timeout is reached.

Of course if network goes down you won't receive packets neither be able to send them so the underlying InputStream and OutputStream will throw an IOException but just when they'll realize that network is not working properly (usually 2*rtt = 120 seconds, it depends how TCP layer is managed).

Look state diagram by yourself:

Network listener in Java

What typically happens is that when in ESTABLISHED your socket will send data over the socket while waiting for ACK from destination. ACK won't come since network went off so your socket's window fills up and socket starts resending packets until real timeout intervenes throwing the exception.

Another case is when network goes off and your socket realizes that it cannot write anymore on channel: it will throw an exception imediately upon calling outStream.write(...).


It's not that easy to tell whether the network is off or just slow.

If you set Timeouts, it will throw exception if it takes too long:

For sockets:

socket.setSoTimeout(CONNECTION_TIMEOUT);

For HttpURLConnections:

HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECTION_TIMEOUT);
con.setReadTimeout(CONNECTION_TIMEOUT);


TCP is designed to be quiet when idle. There is no administrative packets on wire when there is no pending packet. If the connection is dead while idle, you will not know, no matter what the setting of the timeout is. It does have keepalives but it's pretty much useless at the recommended frequency of 2 hours and longer.

You need to build some heartbeat or keepalive in your application protocol to detect stale connections. Keepalive is nothing but a noop packet sent at regular interval to trigger TCP timeout when connection is down. In my app, I do this every 10 seconds.


Why don't you try pinging www.google.com

See http://java.sun.com/j2se/1.5.0/docs/guide/nio/example/Ping.java

0

精彩评论

暂无评论...
验证码 换一张
取 消