Я хочу запустить сервер, которые слушают порт. Я могу указать порт явно, и он работает. Но я хотел бы найти порт автоматическим способом. В этом отношении у меня есть два вопроса.
В котором диапазоне номеров портов я должен искать? (Я использовал порты 12345, 12346, и 12347, и это было прекрасно).
Как я могу узнать, не занят ли данный порт другим программным обеспечением?
Если вы не возражаете против используемого порта, укажите порт 0 в конструкторе ServerSocket , и он будет прослушивать любой свободный порт.
ServerSocket s = new ServerSocket(0);
System.out.println("listening on port: " + s.getLocalPort());
Если вы хотите использовать определенный набор портов, то, вероятно, проще всего перебрать их, пока один из них не сработает. Примерно так:
public ServerSocket create(int[] ports) throws IOException {
for (int port : ports) {
try {
return new ServerSocket(port);
} catch (IOException ex) {
continue; // try next port
}
}
// if the program gets here, no port in the range was found
throw new IOException("no free port found");
}
Можно использовать так:
try {
ServerSocket s = create(new int[] { 3843, 4584, 4843 });
System.out.println("listening on port: " + s.getLocalPort());
} catch (IOException ex) {
System.err.println("no available ports");
}
Если ваш сервер запускается, значит, этот сокет не использовался.
РЕДАКТИРОВАТЬ
Примерно так:
ServerSocket s = null ;
try {
s = new ServerSocket( 0 );
} catch( IOException ioe ){
for( int i = START; i < END ; i++ ) try {
s = new ServerSocket( i );
} catch( IOException ioe ){}
}
// At this point if s is null we are helpless
if( s == null ) {
throw new IOException(
Strings.format("Unable to open server in port range(%d-%d)",START,END));
}
Это может вам не сильно помочь, но на моей машине (Ubuntu) у меня есть файл / etc / services, в котором указаны хотя бы порты, используемые / зарезервированные некоторыми приложениями. Это стандартные порты для этих приложений.
Нет гарантий, что они работают, только порты по умолчанию, которые используются этими приложениями (поэтому вам не следует их использовать, если это возможно).
Определено чуть больше 500 портов, примерно половина UDP и половина TCP.
Файлы созданы с использованием информации IANA, см. Назначенные номера портов IANA .
Согласно Википедии , вы должны использовать порты с 49152
на 65535
, если вам не нужен «хорошо известный» порт.
Насколько мне известно, единственный способ определить, используется ли порт, - это попытаться его открыть.
Если вы передадите 0 в качестве номера порта конструктору ServerSocket, он выделит вам порт.
Eclipse SDK содержит класс SocketUtil , который делает то, что вы хотите. Вы можете ознакомиться с исходным кодом git .
См. http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html# ServerSocket% 28int% 29
Создает серверный сокет, привязанный к указанному порту. Порт 0 создает сокет на любом свободном порте.
Это работает у меня на Java 6
ServerSocket serverSocket = new ServerSocket(0);
System.out.println("listening on port " + serverSocket.getLocalPort());