我正在写一个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友好的方式使用套接字?
根据皮特的回答,有几个澄清:
我不关插座,它是一个单独的单元。添加了一个方法,可以关闭单一实例的套接字,并在servlet的destroy中调用它,这是有效的,谢谢!我认为这有点老土(通过公共方法向世界公开类似的方法),但它可以完成工作。