Как указать диапазон портов для сокетов Java?

StackOverflow https://stackoverflow.com/questions/115500

  •  02-07-2019
  •  | 
  •  

Вопрос

В 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 был прав и это системная операция, вам, возможно, придется просто перебирать порты, пытаясь привязаться к каждому из них, или протестировать его.Хотя это немного болезненно, это не должно превышать нескольких строк кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top