к какому эфемерному порту привязан Java InetSocketAddress? - PullRequest
6 голосов
/ 01 декабря 2011

Чего бы я хотел достичь

привязать сервер к временному порту для модульного тестирования.

Моя проблема:

Используя JDK 1.5.0_22, я пытаюсь привязать InetSocketAddress к временному порту, используя порт 0 согласно javadoc, но я не могу найти способ из объекта адреса узнать, к какому порту он привязан, поэтому я не могу мои клиенты настроены соответственно:

InetSocketAddress address = new InetSocketAddress(0);
assertThat(address.isUnresolved(), is(false));
assertThat(address.getPort(), is(0));

Возможно, я не правильно понял предложение javadoc:

Допустимое значение порта - от 0 до 65535. Номер порта с нулем будет позвольте системе выбрать эфемерный порт в операции связывания.

Но проверка порта даже после того, как мой сервер прослушивает сокет (я предполагаю, что связывание произошло тогда), не возвращает ничего, кроме 0 (в следующем примере используется библиотека http://simpleweb.sourceforge.net/):

    Container httpServer = new Container() {

        public void handle(Request req, Response resp) {
        }
    };
    SocketConnection connection = new SocketConnection(httpServer);
    InetSocketAddress address = new InetSocketAddress(0);
    connection.connect(address);

    assertThat(address.isUnresolved(), is(false));
    assertThat(address.getPort(), is(0));

Используя nmap, я даже не вижу связанный порт, поэтому я предполагаю, что мое понимание неверно. Любая помощь?

1 Ответ

10 голосов
/ 01 декабря 2011

InetSocketAddress, который изначально содержит порт 0, не обновляется connect() для представления фактического порта, к которому был привязан.Вместо этого позвоните connection.getLocalPort() или ((InetSocketAddress)connection.getLocalSocketAddress()).getPort(), чтобы получить связанный порт.

...