Я пишу приложение 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, и вызов его в уничтожении сервлета сработало, спасибо! Я думаю, что это немного хакерски (раскрытие такого метода миру через общедоступный метод), но он выполняет свою работу.