使用 Jetty 独家绑定端口

Vic*_*Vic 1 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 Connector[]{connector});

...
server.start();
Run Code Online (Sandbox Code Playgroud)

当没有其他应用程序捕获 80 端口时,一切都很好。我还确保两个 Jetty 实例无法开始侦听同一端口,因为setReuseAddress.

然而,有一些其他应用程序开始侦听端口 80 并且 Jetty 服务器仍然设法启动(未能在那里提供连接)的情况。

C:\Users\bacadmin>netstat -anov | find ":80 "

TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       3976
TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       3808
TCP    [::]:80                [::]:0                 LISTENING       3976
Run Code Online (Sandbox Code Playgroud)

如果端口未打开,这怎么可能,以及如何确保 Jetty 在启动期间获得异常。

Zor*_*org 5

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

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

好消息,存在解决方法。只需使用-Djava.net.preferIPv4Stack=true. 仅当您没有计划在您的应用程序中支持 IPv6 时,这才有效。

谢谢。