Sono in esecuzione un server Websocket, utilizzando Jetty incorporato.Il server Jetty Websocket funziona localmente, ma le connessioni remote non riescono con l'errore "L'host è inattivo", come risolverlo?
Funziona come previsto quando faccio le connessioni dallo stesso computer (localhost), ma quando provo a collegarmi da una macchina diversa, ottengo l'errore "Host è giù" (anche conosciuto come EHOSTDOWN
).
I registri dicono che Jetty è in ascolto sull'indirizzo 0.0.0.0, quindi dovrebbe accettare connessioni da qualsiasi luogo e la porta (in questo esempio, 12345
) è consentita in ufw
per tutti i protocolli. Ho anche provato a disabilitare temporaneamente ufw
e questo non ha avuto alcun effetto.
Questo è il mio codice (questo è un semplice websocket eco-assistente, ho rimosso tutto ciò che è irrilevante):
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);
}
}
}
Allora, che cosa potrebbe causare tale problema? Non so nient'altro da provare ...
Il tuo codice funziona bene qui. Visto che l'hai taggato con [tag: ubuntu-14.04], hai permesso la porta 12345 (tcp) attraverso il tuo firewall? –
Sì, come ho detto nella domanda, l'ho permesso. (eseguendo 'ufw allow 12345'), dopo aver provato anche il riavvio - nulla è cambiato. Beh, voglio dire, ho aperto la porta prima ancora di provarci. Ma disabilitare "ufw" non ha cambiato nulla. –
Sto usando Fedora 23, una volta avviato il server, sono stato in grado di utilizzare http://www.websocket.org/echo.html da un altro computer per riconnetterlo al websocket EchoSocketAdapter tramite 'ws: // myremote : 12345/ciao/'e testare il comportamento dell'eco proprio bene. –