Как установить опцию повторного использования адреса для сокета датаграммы в коде 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;
}