Как установить опцию повторного использования адреса для сокета датаграммы в коде Java? - PullRequest
6 голосов
/ 20 октября 2011

В моем приложении будет один поток, который всегда работает и будет отправлять или прослушивать какой-либо порт.

Это приложение работает в фоновом режиме. Иногда при создании сокета я обнаружил, что порт, который использовался ранее тем же потоком, не освобождается при закрытии () сокета. Итак, я попробовал вот так

        dc = new DatagramSocket(inetAddr);
        dc.setReuseAddress(true);  

Проблема в том, что она также не доходит до второй строки. в первой строке я получаю исключение BindException: Address already in use.

Может кто-нибудь помочь мне, как справиться с этой ситуацией.

Есть ли способ освободить порт?

Спасибо и всего наилучшего,
SSuman185

Ответы [ 3 ]

13 голосов
/ 10 ноября 2011

DatagramSocket(inetAddr) привязывается к порту. Вам нужно setReuseAddress(true) ДО того, как вы свяжетесь.

Для этого ... используйте следующее:

dc = new DatagramSocket(null);
dc.setReuseAddress(true);
dc.bind(inetAddr);

Этот конструктор оставляет порт свободным.

6 голосов
/ 21 октября 2011

Используйте MulticastSocket. Построить это без аргументов. Это неявно вызывает setReuseAddress (true). Затем вызовите bind ().

В данный момент вы вызываете setReuseAddress () слишком поздно, чтобы сделать что-то хорошее.

1 голос
/ 14 сентября 2016

Вот как у меня это работало:

try {
      clientMulticastSocket = new MulticastSocket(null);
      clientMulticastSocket.setReuseAddress(true);
      clientMulticastSocket.bind(new InetSocketAddress(multicastHostAddress, multicastPort));
      clientMulticastSocket.joinGroup(multicastHostAddress);
    } catch (IOException e) {
      e.printStackTrace();
      return false;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...