最近在写运维管理平台的定时检测集群中各台服务器端口开放状态来判断进程状态的定时任务。顺便整理了下java如何检测服务器一个或者多个端口,以及如何加到定时任务中。
一、java中用Socket检测服务器一个端口开放状态。(对socket不太了解,只是最近用才简单看了下)
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。(百度百科)
个人实现思路是:将传递进来的ip先放到list的第一个位置,为了方便返回时ip和port对应。也可 以用更好的方法,即用set来传递返回值,ip在调用check方法的对象中标记。
java.net 中 SocketAddress 的子类 InetSocketAddress 此类实现 IP 套接字地址(IP 地址 + 端口号)
/**
*
* @param ip
* @param port
* @return
*/
public List check(String ip,String port){
List<String> results=new ArrayList<String>();
results.add(0,ip);
try {
int intport=Integer.parseInt(port);
Socket socket=new Socket();
SocketAddress add = new InetSocketAddress(ip,intport);
socket.connect(add,50);
socket.close();
results.add(port);
return results;
} catch (Exception e) {
// TODO Auto-generated catch block
return null;
}
}