Как указать диапазон портов для сокетов Java?
Вопрос
В Java вы можете указать число ноль в качестве единственного параметра для конструктора Socket или DatagramSocket.Затем Java привязывает этот сокет к свободному порту.Можно ли ограничить поиск порта определенным диапазоном?
Решение
Хм, после прочтения документации я не думаю, что ты сможешь.Вы можете либо выполнить привязку к любому порту, а затем выполнить привязку повторно, если это неприемлемо, либо повторно привязываться к порту в вашем диапазоне, пока не добьетесь успеха.Второй метод будет наиболее «эффективным».
Меня беспокоит этот ответ, потому что это...неэлегантно, но я действительно больше ничего не могу найти :/
Другие советы
Привязка сокета к любому свободному порту (обычно) является функцией поддержки сокетов операционной системы;это не специфично для Java.Например, Solaris поддерживает настройку временного диапазона портов с помощью без даты команда.Но только root может регулировать диапазон, и это влияет на всю систему, а не только на вашу программу.
Если обычное поведение эфемерной привязки не соответствует вашим потребностям, вам, вероятно, придется написать свое собственное, используя Socket.bind().
Вот код, который вам нужен:
public static Socket getListeningSocket() {
for ( int port = MIN_PORT ; port <= MAX_PORT ; port++ )
{
try {
ServerSocket s = new ServerSocket( port );
return s; // no exception means port was available
} catch (IOException e) {
// try the next port
}
}
return null; // port not found, perhaps throw exception?
}
Вы можете взглянуть на Java-код, реализующий используемую вами функцию.Большинство Java-библиотек написаны на Java, поэтому вы можете увидеть там то, что вам нужно.
Предполагая, что @Kenster был прав и это системная операция, вам, возможно, придется просто перебирать порты, пытаясь привязаться к каждому из них, или протестировать его.Хотя это немного болезненно, это не должно превышать нескольких строк кода.