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

#java #android #sockets #exception

#java #Android #сокеты #исключение

Вопрос:

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

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

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

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

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

Есть ли какой-либо способ освободить порт?

Спасибо и с уважением,
SSuman185

Ответ №1:

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

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

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

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

Комментарии:

1. и inetAddr здесь представляет ?!!

2. Это было большой помощью! Спасибо, @poy!

3. Адрес inetsocket addr = новый адрес inetsocket («localhost», 55562);

Ответ №2:

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

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

Комментарии:

1. Я пробовал это, но у меня возникли сомнения? я заметил, что когда я создаю DatagramSocket () с параметрами out, он привязывается к некоторому свободному номеру порта. После установки адреса повторного использования и привязки произойдет привязка к новому порту. Что происходит со старым портом?

2. @SSuman185 правильно, хорошо замечено. Вы должны создать MulticastSocket. Вы можете использовать это так же, как DatagramSocket, конструктор которого по умолчанию был неправильно разработан около 15 лет назад.

3. @Suman Я уже объяснил. Создайте MulticastSocket без аргументов. Какую часть этого вы не понимаете?

Ответ №3:

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

 try {
      clientMulticastSocket = new MulticastSocket(null);
      clientMulticastSocket.setReuseAddress(true);
      clientMulticastSocket.bind(new InetSocketAddress(multicastHostAddress, multicastPort));
      clientMulticastSocket.joinGroup(multicastHostAddress);
    } catch (IOException e) {
      e.printStackTrace();
      return false;
    }