2016-02-01 31 views
11

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 ...

+1

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? –

+0

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. –

+1

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. –

risposta

4

Era la mia stupidità, ho dimenticato di consentire quella porta sul mio router del client. (Peccato che non possa eliminare chiudere la domanda).