Исключительно привязать к порту с причалом - PullRequest
0 голосов
/ 08 марта 2012

В настоящее время у нас запущен сервер 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 все еще удается запустить (не обслуживая соединения там).

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 ]

4 голосов
/ 07 августа 2012

Jetty и любой Java-сервис могут связывать занятый порт без исключения.

Если вы используете Sun JVM 7 в качестве хоста JVM, учтите, что в нем есть проблема, связанная со стеком IPv6. Это все еще не исправлено.

Хорошие новости, обходной путь существует. Просто используйте -Djava.net.preferIPv4Stack=true. Это работает, только если вы не планируете поддерживать IPv6 в своем приложении.

Спасибо.

1 голос
/ 02 февраля 2017

Вы можете попытаться указать IP-адрес и порт, добавив эту строку кода

server = new Server(new InetSocketAddress("127.0.0.1", 8080));

в этом случае причал выдаст исключение:

java.net.BindException: Address already in use: bind
1 голос
/ 08 марта 2012

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

...