java - El servidor Jetty Websocket funciona localmente, pero las conexiones remotas fallan con el error "El host está inactivo", ¿cómo solucionarlo?
ubuntu-14.04 ufw (1)
Fue mi estupidez, olvidé permitir ese puerto en el enrutador de mi cliente . (Lástima que no puedo borrar cerrar la pregunta).
Estoy ejecutando un servidor websocket, utilizando Embedded Jetty.
Funciona según lo previsto cuando hago conexiones desde la misma máquina (localhost), pero cuando intento conectarme desde una máquina diferente, aparece el error "Host is down" (también conocido como EHOSTDOWN
).
Los registros dicen que Jetty está escuchando en la dirección 0.0.0.0, por lo que debe aceptar conexiones de todas partes, y el puerto (en este ejemplo, 12345
) está permitido en ufw
para todos los protocolos. También intenté deshabilitarlo temporalmente y eso no tuvo ningún efecto.
Este es mi código (este es un servidor de eco websocket simple, he eliminado todo lo que es irrelevante):
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);
}
}
}
Entonces, ¿qué podría causar tal problema? Ni siquiera sé nada más para probar ...