Java如何检测网络是否有网、无网状态呢??
监听有网、无网状态。初步想了一下,开始我觉得就用Java的代码来实现,通过捕捉网络异常信息,来确认网络状态,后面想想网络的异常(Exception)是有很多种的,无法准确定位是不是有网、没网。
所以,能不能直接用win linux mac操作系统下的“ping”命令呢,很显然,是可以的。
思路:在Java程序中,调用本地操作系统ping命令,利用ping返回的报文对网络状态加以判断。简单、靠谱。
先看一下终端对指定机器ping的结果图:
下面是用Java Demo调用“ping”的执行效果,简单明了。
package simple.callback.network;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class PingDemo {
/**
* @param target_name IP地址或域名
* @param out_time 超时间隔,单位为毫秒
* @return
* @throws IOException
*/
public static boolean ping(String target_name, int out_time)
throws IOException {
Runtime runtime = Runtime.getRuntime();
String ping_command = "ping " + target_name + " -w " + out_time;
System.out.println("命令格式:" + ping_command);
Process process = runtime.exec(ping_command);
if (null == process)
return false;
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream(), "UTF-8"));// windows下编码默认是GBK,Linux是UTF-8
String line = null;
while (null != (line = bufferedReader.readLine())) {
System.out.println(line);
if (line.startsWith("bytes from",3))
return true;
if (line.startsWith("from"))
return true;
}
bufferedReader.close();
return false;
}
public static void main(String[] args) throws IOException {
System.out.println(PingDemo.ping("127.0.0.1", 10));
System.out.println("====================================");
System.out.println(PingDemo.ping("docs.oracle.com", 10));
}
}
运行效果1(断网):
运行效果2(网络正常):
这里主要使用的是jdk下类Runtime(java.lang.Runtime)java.lang.Runtime#exec(java.lang.String)方法的使用,Java™ Platform Standard Ed. 8说明文档文档如下
Process | Executes the specified string command in a separate process.//在单独的进程中执行指定的字符串命令。 |
perfect。
下面几个图的演示是结合线程来做一个网络检测任务示例( 仅供参考 ):
完整源码:pingsource.tar.gz、pingsource_v2.tar.gz、pingsource_v2.1.tar.gz、pingsource_v2.2.tar.gz、pingsource_v2.3.tar.gz