通常我们以命令的方式判断远程服务器是否正常运行有两种方式,ping 或 telnet 一个远程端口。假设我们要检查的远程服务器都是 Linux 系统。

从 JDK 1.5 以后, InetAddress 类提供一个 isReachable() 方法,用来判断远程主机是否可以到达,这个方法的使用的时候一定要注意以下几点:如果客户端是 Windows 系统,JDK 不会向服务器发送 ICMP 的请求,因为 Windows 没有提供可被调用的底层接口,这时 JDK 会自动向服务器的 Port 7 发起一个 Socket 连接,如果连接也失败,则认为服务器无法到达,返回False。 注意在客户端执行此程序无须管理员用户,但要求服务器端的防火墙放行 Port 7 的访问(大部分 Linux 发行版此端口默认是禁止访问的)。

如果客户端是 Linux 系统, JDK 可以使用底层接口来向服务器发送 ICMP 请求,但执行此程序的用户必须拥有 root 权限,否则 JDK 也会像 Widnows 一样以 Socket 方式进行验证,即向服务器的 Port 7 发起一个 Socket 连接来进行判断。

如果不用 isReachable(),比较简单的方法是 Socket 连接一个指定的端口,但前提是确定此端口可以被访问,如 Web Server 的 80 端口。这种方式对用户权限没有要求,唯一要注意的是,如果无法连接此端口,有可能只是应用服务出现问题,不一定是服务器无法连接。

    private static boolean isReachable(String ip, String port, int timeout) {
boolean reachable = false;
// 如果端口为空,使用 isReachable 检测,非空使用 socket 检测
if(port == null) {
try {
InetAddress address = InetAddress.getByName(ip);
reachable = address.isReachable(timeout);
} catch (Exception e) {
logger.error(e.getMessage());
reachable = false;
}
} else {
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress(ip, Integer.parseInt(port)), timeout);
reachable = true;
} catch (Exception e) {
logger.error(e.getMessage());
reachable = false;
} finally {
try {
if(socket != null) socket.close();
}catch (Exception e) {}
}
}
return reachable;
}

Java 程序检查远程服务器状态的更多相关文章

  1. 使用nodejs和Java访问远程服务器的服务

    既然这篇文章用的是nodejs和Java访问远程服务器的服务,那么咱们先用另一门编程语言,SAP的ABAP(我日常工作使用得最多的编程语言)来开发一个服务吧. 这是我用ABAP编程语言实现服务的类:Z ...

  2. java ssh远程服务器并执行多条shell命令

    java ssh远程服务器并执行多条命令 import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...

  3. java获取远程服务器应用程序服务状态

    package lct.conference.test; import java.io.BufferedReader; import java.io.IOException; import java. ...

  4. java从远程服务器获取PDF文件并后台打印(使用pdfFox)

    一.java原生方式打印PDF文件 正反面都打印,还未研究出只打印单面的方法,待解决 public static void printFile(String path) throws Exceptio ...

  5. java修改远程服务器密码

    积累: 1. echo 用户名:新密码 | chpasswd

  6. java连接远程服务器并执行命令

    导入必要的jar包 <dependency>  <groupId>ch.ethz.ganymed</groupId> <artifactId>ganym ...

  7. Linux 笔记 #03# 在 Debian远程服务器上运行 Java socket程序

    我试图做什么:把我的破代码放到服务器上运行,并成功与客户端进行 socket通信. 预备环境:刚安装好 MySQL 和 JVM 的 Linux远程服务器(Debian 8)一台. 主要有如下几个步骤: ...

  8. java使用sftp下载远程服务器文件

    使用的是springboot的项目,只是贴出主要配置与类,代码较长,可以先折叠: 参考:https://www.cnblogs.com/xyzq/p/7049369.html 操作工具类SftpUti ...

  9. centos7远程服务器中redis的安装与java连接

    1.下载安装redis 在远程服务器中你想下载的位置执行以下命令来下载redis文件到服务器中 $ wget http://download.redis.io/releases/redis-4.0.9 ...

随机推荐

  1. Cocos2d-x使用瓦片地图

    图所示的复杂地图可以使用瓦片地图技术,瓦片地图是用一些小图片(瓦片)拼接而成,这样可以大大地减少内存消耗.如图所示的瓦片地图,只需要如图所示的三个瓦片就可以了. 瓦片地图 地图中的瓦片 瓦片地图的分类 ...

  2. Cocos2d-x中触摸事件

    理解一个触摸事件可以从时间和空间两方面考虑. 1.触摸事件的时间方面 触摸事件的在时间方面,如下图所示,可以有不同的“按下”.“移动”和“抬起”等阶段,表示触摸是否刚刚开始.是否正在移动或处于静止状态 ...

  3. ios 解析json,xml

    一.发送用户名和密码给服务器(走HTTP协议) // 创建一个URL : 请求路径    NSString *urlStr = [NSString stringWithFormat:@"ht ...

  4. [C#]线程处理

    线程处理用于使程序能够执行并发处理,同时执行多个操作.C#中有三种线程的使用方法,BackgroundWorker组件.线程池.自己创建使用线程,接下来分别介绍如何使用. 1.使用Background ...

  5. 查找-find -grep

    find#.#-name#"*pc"#|#xargs#grep#"Flag" “*.pc”设置要找的文件名grep后面是要找的字符串 #是空格

  6. java运算符新用法和^新认识

    public class Demo1 { public static void main(String[] args) { boolean t = false | true; System.out.p ...

  7. web组件新学--layer

    在之前项目后台管理界面开发中,不知道有layer这样好用的组件,我的内心是这样的的...呀!这个框架有弹框,哈哈哈,好开心,不用自己写遮罩层,不用自己写弹框,好开森.. 当知道有layer之后.... ...

  8. offset() position() scrollTop() scrollLeft()

    (1)offset:获取当前元素相对于文档的高度.只对可见元素有效. 不管该元素如何定位,也不管其父元素如何定位,都是获取的该元素相对于当前视口的偏移 (2) position:获取元素相对于最近的一 ...

  9. c++空类的大小

    初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们 ...

  10. linux eval命令

    eval 功能说明:重新运算求出参数的内容.语 法:eval [参数]补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行.参 数:参数不限数目,彼此之间用分号分开. 1.eval命令将 ...