查找服务器可用端口号

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.UnknownHostException;

/**
 * @author N3verL4nd
 * @date 2020/4/14
 */
public class NetUtil {
    public static final String ANYHOST = "0.0.0.0";
    public static final int MAX_PORT = 20000;
    public static final int MIN_PORT = 1025;

    public static int getAvailablePort(int defaultPort) {
        int port = defaultPort;
        while (port < MAX_PORT) {
            if (!isPortInUse(port)) {
                return port;
            } else {
                port++;
            }
        }
        while (port > MIN_PORT) {
            if (!isPortInUse(port)) {
                return port;
            } else {
                port--;
            }
        }
        throw new IllegalStateException("No available port");
    }

    public static String toIpPort(InetSocketAddress socketAddress) {
        StringBuilder localIpPort = new StringBuilder();
        if (socketAddress != null) {
            InetAddress address = socketAddress.getAddress();
            if (address != null && address.getHostAddress() != null) {
                localIpPort.append(address.getHostAddress());
            }
            localIpPort.append(":").append(socketAddress.getPort());
        }
        return localIpPort.toString();
    }

    private static boolean isPortInUse(int port) {
        try {
            bindPort(ANYHOST, port);
            bindPort(InetAddress.getLocalHost().getHostAddress(), port);
            return false;
        } catch (Exception e) {
            return true;
        }
    }

    private static void bindPort(String host, int port) throws IOException {
        ServerSocket s = new ServerSocket();
        s.bind(new InetSocketAddress(host, port));
        s.close();
    }

    public static void main(String[] args) throws UnknownHostException {
        System.out.println(InetAddress.getLocalHost());
        System.out.println(InetAddress.getLocalHost().getHostAddress());
        System.out.println(toIpPort(new InetSocketAddress("127.0.0.1", 8080)));
    }
}

在服务器中,0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip地址都能够访问该服务。

动态端口的范围是从1024~65535,1024端口一般不固定分配给某个服务,在英文中的解释是“Reserved”(保留)。

发布了778 篇原创文章 · 获赞 323 · 访问量 209万+

猜你喜欢

转载自blog.csdn.net/lgh1992314/article/details/105505340