手机版
你好,游客 登录 注册
背景:
阅读新闻

Java检测端口的占用情况

[日期:2013-09-25] 来源:Linux社区  作者:jupiterbee [字体: ]

有时候需要判断本地的某一个端口号是否被占用,网上通用的一种方法是:
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> <local_ip>

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

推荐阅读:

Java Hashtable多线程操作遍历问题 http://www.linuxidc.com/Linux/2013-01/78574.htm

Java多线程顺序执行 http://www.linuxidc.com/Linux/2012-07/65033.htm

Java多线程问题之同步器CyclicBarrier http://www.linuxidc.com/Linux/2012-07/64593.htm

Java多线程之wait()和notify() http://www.linuxidc.com/Linux/2012-03/57067.htm

Java多线程之synchronized http://www.linuxidc.com/Linux/2012-03/57068.htm

Java多线程之并发锁 http://www.linuxidc.com/Linux/2012-03/57069.htm

Java多线程之ThreadPool http://www.linuxidc.com/Linux/2012-03/57071.htm

Java多线程之ThreadLocal http://www.linuxidc.com/Linux/2012-03/57070.htm

linux
相关资讯       Java教程  Java端口 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款