Jetty Websocket 服务器在本地工作,但远程连接失败并出现 "Host is down" 错误,如何解决?
Jetty Websocket server is working locally, but remote connections fail with "Host is down" error, how to fix it?
我是 运行 websocket 服务器,使用嵌入式 Jetty。
当我从同一台机器(本地主机)建立连接时,它按预期工作,但是当我尝试从不同的机器连接时,我收到错误 "Host is down"(也称为 EHOSTDOWN
)。
日志显示 Jetty 正在侦听 0.0.0.0 地址,因此它应该接受来自任何地方的连接,并且端口(在本例中为 12345
)在 ufw
中允许用于所有协议.我也试过暂时禁用 ufw
但没有效果。
这是我的代码(这是一个简单的 websocket 回显服务器,我已经删除了所有不相关的内容):
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);
}
}
}
那么,是什么导致了这样的问题?我什至不知道还有什么可以尝试的……
这是我的愚蠢行为,我忘记在我的 客户端的 路由器上允许该端口。 (可惜我不能删除关闭问题)。
我是 运行 websocket 服务器,使用嵌入式 Jetty。
当我从同一台机器(本地主机)建立连接时,它按预期工作,但是当我尝试从不同的机器连接时,我收到错误 "Host is down"(也称为 EHOSTDOWN
)。
日志显示 Jetty 正在侦听 0.0.0.0 地址,因此它应该接受来自任何地方的连接,并且端口(在本例中为 12345
)在 ufw
中允许用于所有协议.我也试过暂时禁用 ufw
但没有效果。
这是我的代码(这是一个简单的 websocket 回显服务器,我已经删除了所有不相关的内容):
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);
}
}
}
那么,是什么导致了这样的问题?我什至不知道还有什么可以尝试的……
这是我的愚蠢行为,我忘记在我的 客户端的 路由器上允许该端口。 (可惜我不能删除关闭问题)。