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”(保留)。