#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;
}