Как указать диапазон портов для сокетов Java? - PullRequest
10 голосов
/ 22 сентября 2008

В Java вы можете указать нулевое число в качестве одного параметра для конструктора Socket или DatagramSocket. Тогда Java связывает этот сокет со свободным портом. Можно ли ограничить поиск портов определенным диапазоном?

Ответы [ 4 ]

7 голосов
/ 22 сентября 2008

Хмм, после прочтения документации, я не думаю, что вы можете. Вы можете либо связать с любым портом, а затем перепривязать, если это не приемлемо, или повторно связываться с портом в вашем диапазоне, пока вы не добьетесь успеха. Второй метод будет наиболее «эффективным».

Мне неловко от этого ответа, потому что он ... неэлегатный, но я действительно не могу найти ничего другого: /

2 голосов
/ 22 сентября 2008

Вот код, который вам нужен:

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?
}
2 голосов
/ 22 сентября 2008

Привязка сокета к любому свободному порту является (обычно) функцией поддержки сокетов операционной системы; это не характерно для Java. Например, Solaris поддерживает настройку диапазона временных портов с помощью команды ndd . Но только root может регулировать диапазон, и это влияет на всю систему, а не только на вашу программу.

Если обычное эфемерное связывание не соответствует вашим потребностям, вам, вероятно, придется написать свое собственное с помощью Socket.bind ().

0 голосов
/ 22 сентября 2008

Вы можете взглянуть на код Java, который реализует функцию, которую вы используете. Большинство библиотек Java написаны на Java, поэтому вы можете просто увидеть, что вам нужно.

Предполагая, что @Kenster был прав, и это системная операция, вам, возможно, придется просто перебирать порты, пытаясь привязаться к каждому или протестировать его. Хотя это немного больно, это не должно быть больше, чем несколько строк кода.

...