【发布时间】:2026-01-08 19:15:01
【问题描述】:
我正在编写一个 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 友好的方式使用套接字?
Pete 的回答有几点澄清:
我没有关闭套接字;它住在单例中。添加一个可以关闭Singleton的套接字并在servlet的destroy中调用它的方法,谢谢!我认为这有点 hacky(通过公共方法向世界公开这样的方法),但它完成了工作。
【问题讨论】:
-
如果你只是将它添加到 destroy() 它不应该是 hacky,因为只有 servlet 容器可以调用它(而不是 webapp 用户中的公共),如果这就是你的意思.