目前我们有一台以这种方式启动的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端口时,一切都很好。我还确保由于setReuseAddress
,两个Jetty实例无法开始在同一端口上进行侦听。
然而,有一些情况是其他应用程序开始侦听端口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
如果端口未打开,可以采取哪些措施以确保Jetty在启动期间获得异常。
答案 0 :(得分:4)
Jetty和任何基于Java的服务都可以绑定繁忙的端口,无异常。
如果您使用Sun JVM 7作为主机JVM,请注意其中存在与IPv6堆栈相关的问题。它仍然没有修复。
好消息,存在变通方法。只需使用-Djava.net.preferIPv4Stack=true
即可。仅当您没有计划在应用程序中支持IPv6时,此方法才有效。
感谢。
答案 1 :(得分:1)
如果端口已在使用中,Jetty会抛出异常。你是否正在捕捉所有异常并将其压制在某个地方?
关于保留端口:这实际上是不可能的。如果你一直在运行你的码头应用程序并使用80,那么这种保留它... ...
(添加了帮助确定根本原因的代码)
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
public class Main {
public static void main(String[] args) {
Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setReuseAddress(false);
connector.setPort(80);
server.setConnectors(new Connector[]{connector});
try {
server.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在我的环境中,这肯定会得到java.net.BindException: Address already in use: bind
答案 2 :(得分:1)
您可以尝试通过添加此代码行来指定IP地址和端口
server = new Server(new InetSocketAddress("127.0.0.1", 8080));
在这种情况下,jetty将抛出异常:
java.net.BindException: Address already in use: bind