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

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

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

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

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

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

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

С уважением,
SSuman185

3 ответа

Решение

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

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

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

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

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

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

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

try {
      clientMulticastSocket = new MulticastSocket(null);
      clientMulticastSocket.setReuseAddress(true);
      clientMulticastSocket.bind(new InetSocketAddress(multicastHostAddress, multicastPort));
      clientMulticastSocket.joinGroup(multicastHostAddress);
    } catch (IOException e) {
      e.printStackTrace();
      return false;
    }
Другие вопросы по тегам