在实践项目中。常常要处理网络异常等问题。为此,专门设计一个类,随时能够使用。

import java.io.IOException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.Enumeration; /**
* @author administrator
*
*/
public class NetworkMonitor implements Runnable {
private String m_strUrl = "192.168.1.27";
private static boolean m_bNetworkAvailable = false; /**
*
*/
public NetworkMonitor() {
// TODO:
} /**
* @param strUrl
*/
public NetworkMonitor(String strUrl) {
this.m_strUrl = strUrl;
} /**
* @return
*/
public static boolean isNetworkAvailable() {
return m_bNetworkAvailable;
} /* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
while (true) {
try {
InetAddress inetAddress = InetAddress.getByName(m_strUrl);
m_bNetworkAvailable = inetAddress.isReachable(5000); //測试能否够达到该地址 Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
m_bNetworkAvailable = false;
} catch(UnknownHostException e) {
// System.err.println("连接失败");
m_bNetworkAvailable = false;
} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
m_bNetworkAvailable = false;
}
}
} public void isAddressAvailable(String ip) {
try {
InetAddress address = InetAddress.getByName(ip); //ping this IP
if (address instanceof java.net.Inet4Address) {
System.out.println(ip + " is ipv4 address");
} else if (address instanceof java.net.Inet6Address) {
System.out.println(ip + " is ipv6 address");
} else {
System.out.println(ip + " is unrecongized");
} if (address.isReachable(5000)) {
System.out.println("SUCCESS - ping " + ip + " with no interface specified");
} else {
System.out.println("FAILURE - ping " + ip + " with no interface specified");
} System.out.println("\n-------Trying different interfaces--------");
Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
while (netInterfaces.hasMoreElements()) {
NetworkInterface ni = netInterfaces.nextElement();
System.out.println( "Checking interface, DisplayName:" + ni.getDisplayName() + ", Name:" + ni.getName());
if(address.isReachable(ni, 0, 5000)){
System.out.println("SUCCESS - ping " + ip);
} else {
System.out.println("FAILURE - ping " + ip);
}
Enumeration<InetAddress> ips = ni.getInetAddresses();
while(ips.hasMoreElements()) {
System.out.println("IP: " + ips.nextElement().getHostAddress());
}
System.out.println("-------------------------------------------"); }
} catch (Exception e) {
System.out.println("error occurs.");
e.printStackTrace();
}
}
}

实际中须要知道网络状态的时候,不必专门去再检查。由于那样可能会堵塞,导致调用者挂起,在这里直接调用isNetworkAvailable方法能够马上知道网络状态,所以性能不会受到不论什么影响。

这个类以下实现的线程run方法中,检查网络也是2秒钟检查一次,不会影响整个程序的性能。假设有更高的要求,能够改成1秒或者0.5秒。我的意见是2秒够了。

由于网络断开非常快,可是要恢复也是须要点时间的,所以不必重复检查。那样会影响性能。

调用演示样例:

public class Startup { 

	/**
* @see 应用程序入口
* @param args
*/
public static void main(String[] args) {
Startup startup = new Startup();
startup.startNetworkMonitor(); for (int i = 0; i < 60; i++) {
System.out.println("network[" + i + 1 +"]: " + NetworkMonitor.isNetworkAvailable());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} public void startNetworkMonitor() {
NetworkMonitor networkMonitor = new NetworkMonitor();
networkMonitor.isAddressAvailable("192.168.1.1");
Thread thread = new Thread(networkMonitor);
thread.start(); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

试执行就能够知道。 这一句

System.out.println("network[" + i + 1 +"]: " + NetworkMonitor.isNetworkAvailable());

全然就是毫秒级返回。各方面表现很理想。

Java推断和检查网络的更多相关文章

  1. Android——检查网络是否已经链接

    新建一个项目testNet 添加一个button layout.xml: <RelativeLayout xmlns:android="http://schemas.android.c ...

  2. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  3. 四种java代码静态检查工具

    [转载]常用 Java 静态代码分析工具的分析与比较 转载自 开源中国社区 http://www.oschina.net/question/129540_23043       1月16日厦门 OSC ...

  4. android中 检查网络连接状态的变化,无网络时跳转到设置界面

    1:在AndroidManifest.xml中加一个声明 <receiver android:name="NetCheckReceiver">    <inten ...

  5. android检查网络连接状态的变化,无网络时跳转到设置界面

    在AndroidManifest.xml中加一个声明<receiver android:name="NetCheckReceiver"> <intent-filt ...

  6. Java(40)网络编程

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201659.html 博客主页:https://www.cnblogs.com/testero ...

  7. iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  8. 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

    1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...

  9. [原创]Java静态代码检查工具介绍

    [原创]Java静态代码检查工具介绍 一  什么是静态代码检查? 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数 ...

随机推荐

  1. 微信小程序一些常见的坑

    1.小程序都报wxss编译错误 解决方法: 在控制台输入openVendor() ,清除里面的wcsc wcsc.exe 然后重启工具 2.微信小程序wx:for警告 Now you can prov ...

  2. activity生命周期知识点整理

    activity生命周期知识点整理 Activity: 是一个应用组件,用户可与其提供的屏幕进行交互.窗口通常会充满屏幕,但也可以小于屏幕并浮动在其他窗口之上. 一个activity的什么周期: 启动 ...

  3. Matlab2014的下载和安装激活过程

    Matlab2014的下载和安装过程 转载自csdn  https://blog.csdn.net/hp910315/article/details/70197149 1 下载Matlab2014,下 ...

  4. Android常见问题总结(二)

    1.布局文件LinearLayout线性布局添加内容报错. 解决方法: 线性布局LinearLayout中包裹的元素多余1个需要添加android:orientation属性. 2.android 的 ...

  5. python 正则表达式操作

    正则表达式操作  本模块提供了类似于Perl的正则表达式匹配操作.要匹配的模式和字符串可以是Unicode字符串以及8位字符串. 正则表达式使用反斜杠字符('\')来表示特殊的形式或者来允许使用特殊的 ...

  6. python学习笔记(2)——练习小程序之 " input " 隐藏陷阱

    练习小程序之 ----------" input " 隐藏陷阱 age=input('please enter your age:') if age>=18: print(' ...

  7. dutacm.club_1089_A Water Problem_(dp)

    题意:要获得刚好后n个'k'的字符串,有两种操作,1.花费x秒,增加或删除1个'k'; 2.花费y秒,使个数翻倍.问最少需要多少时间获得这个字符串. 思路:i为偶数个'k',dp[i]=min(dp[ ...

  8. CAD绘制一个单行文字(com接口VB语言)

    主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX >文字的位置的X坐标 DOUBLE dPosY 文字的位置的Y ...

  9. 梦想CAD控件COM接口文字样式

    增加文字样式 用户可以增加文字样式到数据库,并设置其字体等属性,具体实现c#代码如下: private void CreateText() { MxDrawApplication app = new ...

  10. oracle_backup

    #!/bin/bash DAYS=`date +"%Y%m%d"` . /home/oracle/.bash_profile # /home/opt/oracle/11g/bin/ ...