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