使用Jetty独占绑定到端口

时间:2012-03-08 08:18:19

标签: 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();

当没有其他应用程序捕获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在启动期间获得异常。

3 个答案:

答案 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