我如何在java中选择哪个端口可以免费用于ServerSocket或Socket?

时间:2015-07-07 19:44:39

标签: java sockets

我正在研究java。我如何检查端口是否可以免费用于ServerSocket? 此外,当accept()函数返回一个Socket时,默认情况下是否给出了一个端口和IP地址,或者我也必须指定它?

5 个答案:

答案 0 :(得分:6)

您可以将java.net.ServerSocket构造函数与端口0一起使用,告诉ServerSocket找到一个空闲端口。

documentation

  

port - 端口号,或0表示使用的端口号   自动分配。

示例:

int port = -1;
try {
    ServerSocket socket = new ServerSocket(0);
    // here's your free port
    port = socket.getLocalPort();
    socket.close();
} 
catch (IOException ioe) {}

答案 1 :(得分:1)

使用Try catch查找空闲端口

private static int port=9000;
public static int detectPort(int prt)
{
try{
//connect to port
}
catch(Exception e)
{
return detectPort(prt+1);
}
return prt;
}

// Write detectPort(port); inside main

答案 2 :(得分:1)

我已经发布了一个小型库,只是考虑到了测试。 Maven依赖是:

<dependency>
    <groupId>me.alexpanov</groupId>
    <artifactId>free-port-finder</artifactId>
    <version>1.0</version>
</dependency>

安装后,可通过以下方式获取空闲端口号:

int port = FreePortFinder.findFreeLocalPort();

答案 3 :(得分:0)

  

如何检查端口是否可以免费用于ServerSocket?

你不会。您可以指定端口0,这会导致系统为您提供一个空闲端口。

  

此外,当accept()函数返回一个Socket时,它默认给出一个端口和IP地址

是。它被给予对等体连接的IP地址,以及与侦听套接字相同的端口。

  

或者我也必须指明它?

没有

答案 4 :(得分:0)

我们可以参考Spring的SocketUtils如何运作。

关键的想法是生成一个随机端口,检查它是否可用,并重复直到找到可用端口。

private enum SocketType {

    TCP {
        @Override
        protected boolean isPortAvailable(int port) {
            try {
                ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(
                        port, 1, InetAddress.getByName("localhost"));
                serverSocket.close();
                return true;
            }
            catch (Exception ex) {
                return false;
            }
        }
    },

    UDP {
        @Override
        protected boolean isPortAvailable(int port) {
            try {
                DatagramSocket socket = new DatagramSocket(port, InetAddress.getByName("localhost"));
                socket.close();
                return true;
            }
            catch (Exception ex) {
                return false;
            }
        }

};