Привязка к сокету в Tomcat - PullRequest
2 голосов
/ 19 марта 2009

Я пишу приложение Tomcat. В рамках своей функциональности он должен отправлять многоадресную UDP-передачу, когда происходят определенные события. Прямо сейчас мой код выглядит примерно так (хост и группа фальшивые, обработка исключений вырвана для экономии места):

import java.net.*;
/* ..... */
DatagramSocket socket = new DatagramSocket(12345);
InetAddress group = InetAddress.getByName("111.222.333.444");
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 12346);
socket.send(packet);

Это прекрасно работает, когда я устанавливаю его в Tomcat; однако, когда я пытаюсь установить новую версию приложения (используя «ant remove; ant install;»), мне не удается привязаться к сокету и получить java.net.BindException: Address already in use. Единственный выход - перезапускать Tomcat каждый раз, что явно недопустимо. Как использовать сокеты для Tomcat-совместимого способа?

Пара разъяснений в ответе Пита:

Я не закрываю розетку; он живет в синглтоне. Добавление метода, который может закрыть сокет для Singleton и вызов его в разрушении сервлета, сработало, спасибо! Я думаю, что это немного хакерски (разоблачение такого метода перед миром с помощью публичного метода), но оно выполняет свою работу.

1 Ответ

1 голос
/ 19 марта 2009

Вы закрываете сокет после того, как используете его через disconnect () / close ()? Каков жизненный цикл в сокете - по запросу или по одному? Если это на запрос, закрытие сокета должно освободить его. Если синглтон, вам нужно каким-то образом закрыть его в «удаление муравья» - если закрытие / перезапуск Tomcat недопустим, то, возможно, ваш скрипт ant может вызвать некоторую безопасную страницу и т. Д., Которая закрывает сокет. Если вы можете выполнить перезапуск выключения, закройте сокет в методе destroy () сервлета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...