Java推断和检查网络
在实践项目中。常常要处理网络异常等问题。为此,专门设计一个类,随时能够使用。
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推断和检查网络的更多相关文章
- Android——检查网络是否已经链接
新建一个项目testNet 添加一个button layout.xml: <RelativeLayout xmlns:android="http://schemas.android.c ...
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- 四种java代码静态检查工具
[转载]常用 Java 静态代码分析工具的分析与比较 转载自 开源中国社区 http://www.oschina.net/question/129540_23043 1月16日厦门 OSC ...
- android中 检查网络连接状态的变化,无网络时跳转到设置界面
1:在AndroidManifest.xml中加一个声明 <receiver android:name="NetCheckReceiver"> <inten ...
- android检查网络连接状态的变化,无网络时跳转到设置界面
在AndroidManifest.xml中加一个声明<receiver android:name="NetCheckReceiver"> <intent-filt ...
- Java(40)网络编程
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201659.html 博客主页:https://www.cnblogs.com/testero ...
- iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...
- [原创]Java静态代码检查工具介绍
[原创]Java静态代码检查工具介绍 一 什么是静态代码检查? 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数 ...
随机推荐
- 个人作业-Alpha测试
课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 作业要求 https://edu.cnblogs.com/campu ...
- Pro ASP.NET Core MVC 6th 第三章
第三章 MVC 模式,项目和约定 在深入了解ASP.NET Core MVC的细节之前,我想确保您熟悉MVC设计模式背后的思路以及将其转换为ASP.NET Core MVC项目的方式. 您可能已经了解 ...
- 【转】jvm内存结构
JVM的基本结构 包括四部分:类加载器.执行引擎.内存区(运行时数据区).本地方法接口 类加载器:jvm启动时或类运行时将需要的class文件加载到JVM中. JVM内存申请过程如下: JVM 会试图 ...
- Farseer.net轻量级开源框架 中级篇:数据库切换
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 下一篇:Farseer.net轻量级开源框架 中级篇: SQL执行 ...
- vs2017 创建C#类时添加文件头
C#类模板地址:C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\ItemTemplates\C ...
- 【笔记JS/HTML/CSS】用div实现个性化button,背景半透明
html中的button默认样式..不太能看,如果调一调背景色和字体的话也挺适合简洁的页面设计 于是决定配合JS,用html中的div完成button 最终结果图: html代码:(first_pas ...
- C语言编辑编译及集成开发环境
C语言编辑编译及集成开发环境 编辑器 在不同的操作系统上使用不同的编辑器,保存源代码文件时,文件名应指出程序的功能扩展名应为.c. 编译器 编译器把源代码编译成机器语言的二进制指令即目标代码生成目标文 ...
- 【原】Mysql存储关联数组
$fruits= array("apple" => "苹果", "banana" => "香蕉"," ...
- DH密钥交换算法
DH密钥交换算法:DH的全称为Diffie-Hellman ,该算法可以在需要安全传输的前提下,确定双方的对称密钥,该算法的核心在于双方的私钥没有进入网络传输流程,根据对方的公钥和己方的私钥,可以计算 ...
- linux命令 info
info命令是Linux下info格式的帮助指令. 就内容来说,info页面比man page编写得要更好.更容易理解,也更友好,但man page使用起来确实要更容易得多.一个man page只有一 ...