【问题标题】:Binding to a socket in Tomcat绑定到Tomcat中的套接字
【发布时间】: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 用户中的公共),如果这就是你的意思.

标签: java sockets tomcat


【解决方案1】:

您是否在通过disconnect()/close() 使用套接字后关闭它?套接字的生命周期是什么——每个请求还是单例?如果是每个请求,关闭套接字应该释放它。如果是单例,您需要以某种方式在“ant remove”上关闭它 - 如果关闭/重新启动 Tomcat 是不可接受的,那么您的 ant 脚本可能会调用一些安全页面等来关闭套接字。如果可以导致关机重启,则在 servlet 的 destroy() 方法中关闭套接字。

【讨论】: