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

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. python的机器学习之路

    2018-04-1712:22:40 这是python依靠计算机视觉进行的ocr手写字的识别. 通过KNN训练数据 kNN 可以说是最简单的监督学习分类器了.想法也很简单,就是找出测试数据在特征空间中 ...

  2. 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析

    对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...

  3. FPGA编程技巧系列之输入输出偏移约束详解

    1.   偏移约束的作用 偏移约束(Offset Constraint)用来定义一个外部时钟引脚(Pad)和数据输入输出引脚之间的时序关系,这种时序关系也被称为器件上的Pad-to-Setup或Clo ...

  4. CPU位数、操作系统位数、机器字长、C/C++基本数据类型长度

    1.CPU位数=CPU中寄存器的位数=CPU能够一次并行处理的数据宽度(位数)=数据总线宽度: //现在的计算机处理器一般都是64位,这是硬件的事. 2.CPU为了实现其功能设计了指令集,即是CPU的 ...

  5. 2-2 列表推导同 filter 和 map 的比较

    列表推导同 filter 和 map 的比较 参考廖雪峰的文档: filter()函数:用于过滤序列. filter()接收一个函数和一个序列.把传入的函数依次作用于传入的序列的每个元素,根据返回值是 ...

  6. Python中的排序方法

    1 list.sort list.sort(key=None, reverse=False) 该方法只能用于list.就地排序,原来的list被修改.key的用法见下文.reverse控制降序还是生序 ...

  7. jmeter插件之PerfMon

    PerfMon是jmeter监控系统资源的一款插件,可以用来监控系统的CPU/内存/IO等性能指标. 一.要准备好的插件:JMeterPlugins-Standard-1.4.0(pwd:cjqd)或 ...

  8. org-table

    ‎ Table of Contents 1. table 1.1. 创建方式 1.2. 重新对齐 1.3. 行列编辑 1.4. 区域 1.5. 计算 1.6. 其他的 1.7. 行宽度 1.8. 列分 ...

  9. TWaver矢量小试——Android演进路线图

    还有半个多月就到春节了,年底相信很多公司都会进行年度总结以及公司发展状况总结,在这过程中难免会用到RoadMap,在这我们也使用TWaver的矢量部分绘制一个Android系统的发展历程.先看效果:什 ...

  10. 大数低速幂运算模板(c++)+python大数幂

    简介 自己从大数加法改过来的模板,低速计算n的t次幂,n,t小于等于100速度能够保证 模板 #include <bits/stdc++.h> using namespace std; s ...