Java 通过Jetty专门绑定到端口

Java 通过Jetty专门绑定到端口,java,jetty,Java,Jetty,目前,我们有一个Jetty 7服务器以这种方式启动 //create a new server listening on the 80 Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setReuseAddress(false); connector.setPort(80); server.setConnectors(new Conn

目前,我们有一个Jetty 7服务器以这种方式启动

//create a new server listening on the 80
Server server = new Server();

SelectChannelConnector connector = new SelectChannelConnector();
connector.setReuseAddress(false);
connector.setPort(80);
server.setConnectors(new Connector[]{connector});

...
server.start();
当没有其他应用程序捕获80端口时,一切正常。我还确保了Jetty的两个实例不能在同一个端口上开始侦听,因为
setReuseAddress

然而,也有一种情况,当其他应用程序开始侦听端口80时,Jetty server仍然能够启动(无法为那里的连接提供服务)


如果端口未打开,如何确保Jetty在启动过程中发生异常。如果端口已在使用,Jetty将引发异常。您是否正在捕获所有异常并在某个地方将其抑制

关于保留端口:这实际上是不可能的。如果您一直在运行jetty应用程序,并使用80,那么这是为您保留的

(添加代码以帮助识别根本原因)


在我的环境中,如果端口已经在使用中,Jetty会抛出异常。您是否正在捕获所有异常并在某个地方将其抑制

关于保留端口:这实际上是不可能的。如果您一直在运行jetty应用程序,并使用80,那么这是为您保留的

(添加代码以帮助识别根本原因)


在我的环境中,这肯定会得到
java.net.BindException:Address ready In use:bind

Jetty,任何基于java的服务都可以毫无例外地绑定繁忙的端口

如果您使用Sun JVM 7作为主机JVM,请注意其中存在与IPv6堆栈相关的问题。它仍然没有固定下来

好消息是,存在一个变通办法。只需使用
-Djava.net.preferIPv4Stack=true
。只有当您没有在应用程序中支持IPv6的计划时,这才有效


谢谢。

Jetty和任何基于Java的服务都可以毫无例外地绑定繁忙端口

如果您使用Sun JVM 7作为主机JVM,请注意其中存在与IPv6堆栈相关的问题。它仍然没有固定下来

好消息是,存在一个变通办法。只需使用
-Djava.net.preferIPv4Stack=true
。只有当您没有在应用程序中支持IPv6的计划时,这才有效


谢谢。

您可以通过添加这行代码来尝试指定IP地址和端口

server = new Server(new InetSocketAddress("127.0.0.1", 8080));
在这种情况下,jetty将引发异常:

java.net.BindException: Address already in use: bind

您可以尝试通过添加这行代码来指定IP地址和端口

server = new Server(new InetSocketAddress("127.0.0.1", 8080));
在这种情况下,jetty将引发异常:

java.net.BindException: Address already in use: bind

有趣的是,Jetty不会抛出异常,但Jetty会抛出异常。如果你没有看到一个,那么你的设置会发生一些奇怪的事情。@Tim,我正在消除干扰,没有例外。如果我试图让两个码头在同一个港口上运行,那么会有一个例外。@Jayan-我的也是。但另一个应用程序不是jetty应用程序,如果它在jetty服务器启动之前运行,则不会引发异常。。。这条讨论线索很有趣。我发现使用setReuseAddress(false)时,如果已经绑定,则总是会得到异常。使用setReuseAddress(true),您在Linux或Mac OS上会出现异常,但在Windows上它会成功,并且会发生什么。有趣的是,Jetty不会引发异常。但是Jetty确实会引发异常。如果你没有看到一个,那么你的设置会发生一些奇怪的事情。@Tim,我正在消除干扰,没有例外。如果我试图让两个码头在同一个港口上运行,那么会有一个例外。@Jayan-我的也是。但另一个应用程序不是jetty应用程序,如果它在jetty服务器启动之前运行,则不会引发异常。。。这条讨论线索很有趣。我发现使用setReuseAddress(false)时,如果已经绑定,则总是会得到异常。使用setReuseAddress(true),您在Linux或Mac OS上会遇到异常,但在Windows上它会成功,而且会发生什么。假设它没有绑定到另一个接口,我相信一些应用程序允许通过
重新使用端口,所以\u REUSEPORT
。请参阅和。另一篇精彩的评论如下:。我仍然对MacOS上的行为感到困惑。如果我找到一个解决方案,我会发布一个解决方案。也许还有另一个:假设它没有绑定到另一个接口,我相信一些应用程序允许通过
重新使用端口。请参阅和。另一篇精彩的评论如下:。我仍然对MacOS上的行为感到困惑。如果我找到一个解决方案,我会发布一个解决方案。也许还有另一个: