设为首页 加入收藏

TOP

Java检测端口的占用情况
2014-11-24 02:48:07 来源: 作者: 【 】 浏览:19
Tags:Java 检测 占用 情况

有时候需要判断本地的某一个端口号是否被占用,网上通用的一种方法是:
public boolean isPortAvailable(int port) {
try {
ServerSocket server = new ServerSocket(port);
System.out.println("The port is available.");
return true;
} catch (IOException e) {
System.out.println("The port is occupied.");
}
return false;
}


通过新建一个ServerSocket来判断端口是否被占用,但是实际上这个检测方式是有漏洞的,有些情况不能够覆盖得到。例如,一个运行在WebLogic之上的应用它的端口为8406,则通过命令


netstat -aon | findstr 8406


得到的结果可能为:
TCP 192.168.1.101:8406 111.111.111.111:80 SYN_SENT 112


可见8406绑定的内部IP地址为本机的IP地址192.168.1.101,这时通过如上的方式得到的结果为这个端口没有被使用。原因在于通过ServerSocket建立的连接绑定的IP为0.0.0.0,这一小小的差异导致了如上方法没有通用性,找到一种比较好的方法为:
private void bindPort(String host, int port) throws Exception {
Socket s = new Socket();
s.bind(new InetSocketAddress(host, port));
s.close();
}
public boolean isPortAvailable(int port) {
Socket s = new Socket();
try {
bindPort("0.0.0.0", port);
bindPort(InetAddress.getLocalHost().getHostAddress(), port);
return true;
} catch (Exception e) {
return false;
}
}


通过一个socket分别尝试去绑定0.0.0.0和本机IP上的port,当这两个port都可以被绑定时,则这个端口真的没有被占用。在linux上这一方法同样适用,但是有一种情况需要注意,当本机通过hostname不能解析到本机的IP地址时InetAddress.getLocalHost().getHostAddress()这个函数会抛错,导致从结果来看端口被占用着。因此需要确保在/etc/hosts文件中存在着这么一条映射:


为你在终端执行hostname返回的本机名,则为在终端执行ifconfig得到的本机真实IP,JAVA提供的这个函数会去这个文件中找对应的IP地址,不然会因为找不到而抛错。确保这一条之后,在linux上也能正确检测指定端口的占用情况~


推荐阅读:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java中的大数字BigInteger和BigDe.. 下一篇Android开发实践:多级列表的封装..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: