我正在研究java。我如何检查端口是否可以免费用于ServerSocket
?
此外,当accept()
函数返回一个Socket时,默认情况下是否给出了一个端口和IP地址,或者我也必须指定它?
答案 0 :(得分:6)
您可以将java.net.ServerSocket
构造函数与端口0
一起使用,告诉ServerSocket
找到一个空闲端口。
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;
}
}
};