Сервер Jetty Websocket работает локально, но удаленные подключения завершаются ошибкой Host is down, как это исправить?

Я использую сервер веб-сокетов, используя встроенный Jetty.

Он работает должным образом, когда я подключаюсь с того же компьютера (localhost), но когда я пытаюсь подключиться с другого компьютера, я получаю сообщение об ошибке "Хост не работает" (также известную как EHOSTDOWN).

В журналах говорится, что Jetty прослушивает адрес 0.0.0.0, поэтому он должен принимать соединения отовсюду, а порт (в данном примере 12345) разрешен в ufw для всех протоколов. Я также пытался временно отключить ufw, но это не дало никакого эффекта.

Это мой код (это простой эхо-сервер веб-сокета, я удалил все, что не имеет значения):

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.websocket.api.WebSocketAdapter;
import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
import java.io.IOException;

public class EchoServerLauncher {
    static final int PORT = 12345;

    public static void main(String[] args) {
        startServer(PORT);
    }
    private static void startServer(final int port) {
        new EchoServer(port).startAndJoin();
    }
}

class EchoServer extends WebsocketServerBase {
    static final String PATH = "/hello/";

    public EchoServer(final int port) {
        super(port);
    }
    void startAndJoin() {
        super.startAndJoinWithServlet(new EchoServlet(), PATH);
    }
}

class EchoServlet extends WebSocketServlet {
    @Override
    public void configure(final WebSocketServletFactory factory) {
        factory.setCreator((req, resp) -> new EchoSocketAdapter());
    }
}

class EchoSocketAdapter extends WebSocketAdapter {
    @Override
    public void onWebSocketText(final String message) {
        super.onWebSocketText(message);
        if (message == null) return;
        try {
            getSession().getRemote().sendString(message);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

class WebsocketServerBase {
    private final int port;

    public WebsocketServerBase(int port) {
        this.port = port;
    }
    void startAndJoinWithServlet(WebSocketServlet servlet, String path) {
        final Server server = new Server();
        final ServerConnector connector = new ServerConnector(server);
        connector.setPort(this.port);

        server.addConnector(connector);

        final ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
        contextHandler.setContextPath("/");

        server.setHandler(contextHandler);

        final ServletHolder servletHolder = new ServletHolder(servlet.getClass().getSimpleName(), servlet);
        contextHandler.addServlet(servletHolder, path);

        try {
            server.start();
            server.dump(System.err);
            server.join();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }
    }
}

Итак, что может вызвать такую ​​​​проблему? Я даже не знаю, что еще попробовать…


person Display Name    schedule 01.02.2016    source источник
comment
Ваш код отлично работает здесь. Увидев, что вы пометили это с помощью ubuntu-14.04, разрешили ли вы порт 12345 (tcp) через брандмауэр?   -  person Joakim Erdfelt    schedule 01.02.2016
comment
Да, как я сказал в вопросе, я разрешил это. (запустив ufw allow 12345), после этого также пробовал перезагружаться — ничего не изменилось. Ну, я имею в виду, что я открыл порт, даже не попытавшись. А вот отключение ufw вообще ничего не изменило.   -  person Display Name    schedule 01.02.2016
comment
Я использую Fedora 23, после запуска сервера я смог использовать websocket.org/echo. html с другого компьютера, чтобы снова подключиться к веб-сокету EchoSocketAdapter через ws://myremote:12345/hello/ и проверить поведение эха.   -  person Joakim Erdfelt    schedule 01.02.2016
comment
Сообщение Host is down указывает на более фундаментальную проблему с сетью между этими двумя машинами. Можете ли вы даже получить ответ на пинг от целевого сервера? Можете ли вы получить доступ к каким-либо другим службам на сервере с тестовой машины?   -  person Joakim Erdfelt    schedule 01.02.2016
comment
@JoakimErdfelt да, я почти уверен, что проблема не в коде. Вероятно, это какая-то неправильная конфигурация в ОС. Плохо то, что я понятия не имею, где искать. И у меня другое программное обеспечение работает на этой машине без таких проблем.   -  person Display Name    schedule 01.02.2016
comment
@JoakimErdfelt да, я могу пропинговать эту машину, и у нее есть несколько работающих и доступных сервисов, включая nginx, ssh, openvpn и другое приложение Java, которое, похоже, тоже использует Jetty под капотом (но для HTTP, а не для веб-сокета).   -  person Display Name    schedule 01.02.2016
comment
От какого клиента вы видите сообщение Host is down?   -  person Joakim Erdfelt    schedule 01.02.2016
comment
Я попробовал pypi.python.org/pypi/websocket-client, а также свой собственный код с использованием клиента веб-сокета Jetty. Оба подхода дали ошибку Host is down. (OTOH, если я попытаюсь подключиться к другому, явно закрытому порту, ошибка изменится на Отказано в подключении, так что есть некоторая разница). И оба способа работают нормально на локальной машине.   -  person Display Name    schedule 01.02.2016
comment
«Хост недоступен» не является сообщением об ошибке Java. Это один из ваших? Если да, то где вы его выдаете и при каких обстоятельствах?   -  person user207421    schedule 04.02.2016
comment
@EJP Я получаю эту ошибку на стороне клиента при попытке удаленного подключения к серверу (с другого компьютера). Однако у других служб на этом сервере такой проблемы нет. Текстовый хост не работает, это не моя ошибка, это одна из стандартных сетевых ошибок   -  person Display Name    schedule 04.02.2016
comment
Нет, это не так. Это должно быть из библиотеки. «Стандартная сетевая ошибка» для этого может быть несколькими вещами, от «отказ в соединении» до «хост недоступен» до «нет маршрута к хосту» и т. д., и поэтому я задал вопрос. Без этой информации будет трудно помочь.   -  person user207421    schedule 05.02.2016
comment
@EJP хорошо, понял. Я постараюсь копнуть глубже, когда перестану болеть :/   -  person Display Name    schedule 05.02.2016
comment
@EJP Основная ошибка: EHOSTDOWN   -  person Display Name    schedule 08.02.2016


Ответы (1)


Это была моя глупость, я забыл разрешить этот порт на маршрутизаторе моего клиента. (Жаль, что я не могу удалить закрыть вопрос).

person Display Name    schedule 09.02.2016