Vic Vic - 4 years ago 359
Java Question

Exclusively bind to a port with Jetty

Currently we have a Jetty 7 server started this way

//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();


And when there's no other application catching the 80 port, all is fine. I've also ensured that two Instances of Jetty can't start listening on the same port because of the
setReuseAddress
.

There is however a case when some other application starts listening on port 80 and Jetty server still manages to start (failing to serve connections there).

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


How is that possible and what can be done to insure that Jetty gets an exception during startup if the port isn't open.

Answer Source

Jetty throws exception if the port is already in use. Are you catching all exceptions and suppressing it somewhere?

Regarding reserving a port: This is not really possible. If you keep running your jetty application all the time and use 80, then that kind of reserved it for you...

(added code to help in identifying the root cause)

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(); 
        }

    }
}

In my environment, this definitely get java.net.BindException: Address already in use: bind

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download