代码之家  ›  专栏  ›  技术社区  ›  SquareCog

绑定到Tomcat中的套接字

  •  2
  • SquareCog  · 技术社区  · 17 年前

    我正在写一个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中调用它,这是有效的,谢谢!我认为这有点老土(通过公共方法向世界公开类似的方法),但它可以完成工作。

    1 回复  |  直到 17 年前
        1
  •  1
  •   Peter    17 年前

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