我怎样才能获得已占用的端口?

时间:2012-07-05 09:45:20

标签: java java-ee port

我正在为我们的组织开发eclipse插件。我们通过eclipse使用这个插件在用户机器上打开多个服务器[最少10台服务器]。对于启动服务器,我们需要尚未绑定的端口号。为此,我使用serversocket来检查这个。我认为打开serversocket对象是一项代价高昂的操作。内部serversocket将检查端口是否已绑定至少需要50毫秒。这是我返回自由端口的代码。有没有办法在不使用OS命令和打开ServerSocket的情况下找到已占用的端口?

     /**
     *Tries 100 times
     * @param port
     * modes
     *  1.increment - 1
     *  This mode increment the port with your start value . But it's costly operation because each time we open a socket and check the port is free .
     *  2.decrement - 2
     *  Invert of increment.
     *  3.random - 3
     *  Randomly choose based on your starting point
     * @return
     */
    public static String getDefaultPort(int port , int mode){
        int retry = 100;
        int random = 3;
        int increment = 1;
        int decrement = 2;
        while(true){
            //this is for preventing stack overflow error.
            if(retry < 1){ //retries 100 times .
                break;
            }
            if(mode==increment){
                port++;
            }else if(mode == decrement){
                port--;
            }else if(mode == random){
                port = (int) (port+Math.floor((Math.random()*1000)));
            }
            if(validate(port+"")){
                long end = System.currentTimeMillis();
                return port+"";
            }
        }
        return "";
    }

    public boolean validate(String input) {
    boolean status = true;
    try {
        int port = Integer.parseInt(input);
        ServerSocket ss = new ServerSocket(port);
        ss.close();         
    }
    catch (Exception e) {
        status = false;
    }
    return status;
}

1 个答案:

答案 0 :(得分:2)

最快方式是运行本机netstat命令并解析输出。这是available on Windows as well and Linux platform。典型的netstat命令输出如下

 Proto  Local Address          Foreign Address        State
 TCP    MYHOST:8080           MYHOST.mydomain.co.in:0  LISTENING
 TCP    MYHOST:9090           MYHOST.mydomain.co.in:0  LISTENING
 TCP    MYHOST:3389           MYHOST.mydomain.co.in:0  LISTENING
 TCP    MYHOST:7717           MYHOST.mydomain.co.in:0  LISTENING
 TCP    MYHOST:51114          MYHOST.mydomain.co.in:0  LISTENING
 TCP    MYHOST:netbios-ssn    MYHOST.mydomain.co.in:0  LISTENING
 TCP    MYHOST:netbios-ssn    MYHOST.mydomain.co.in:0  LISTENING
 TCP    MYHOST:2573           hj-lyncfe.mydomain.co.in:5061  ESTABLISHED
 TCP    MYHOST:2591           mail.mydomain.co.in:8502  ESTABLISHED
 TCP    MYHOST:2593           mail.mydomain.co.in:8502  ESTABLISHED

您感兴趣的端口位于Local AddressStateLISTENING