2016-02-01 22 views
11

Gömülü Jetty kullanarak bir websocket sunucusu çalıştırıyorum.Jetty Websocket sunucusu yerel olarak çalışıyor ancak uzak bağlantılar "Host down down" hatasıyla başarısız oluyor, nasıl düzeltilir?

aynı makinede (localhost), gelen bağlantıları yapmak ama farklı bir makineden bağlanmaya çalıştığınızda, hatasını "ana bilgisayar çalışmıyor" (ayrıca EHOSTDOWN olarak da bilinir) eve geldiğinde amaçlandığı gibi çalışır.

Günlükler, Jetty'nin 0.0.0.0 adresinde dinlediğini, dolayısıyla her yerden bağlantı kabul etmesini ve tüm protokoller için bağlantı noktasının (bu örnekte, 12345) ufw içinde izinli olduğunu söylüyor. Ayrıca ufw'u geçici olarak devre dışı bırakmayı denedim ve hiçbir etkisi olmadı.

Bu benim kodu (bu basit WebSocket yankı-sunucu, ben alakasız her şeyi kaldırdık edilir): Bu tür soruna neden ne olabilir Yani

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); 
     } 
    } 
} 

? Hatta Benim aptallıktı

+1

Kodunuz burada düzgün çalışıyor. Bunu [tag: ubuntu-14.04] ile etiketlediğinizde, güvenlik duvarınızdaki 12345 numaralı bağlantı noktasına (tcp) izin verdiniz mi? –

+0

Evet, söylediğim gibi, izin verdim. ('ufw izin 12345' çalıştırılarak), bundan sonra yeniden başlatmayı denedi - hiçbir şey değişmedi. Yani, denemeden önce limanı açtım. Fakat 'ufw' tamamen devre dışı bırakıldığında hiçbir şey değişmedi. –

+1

Fedora 23 kullanıyorum, sunucu çalıştıktan sonra, http: //www.websocket.org/echo.html'yi farklı bir makineden EchoSocketAdapter web sitesine yeniden bağlamak için kullanabiliyordum: ws: // myremote : 12345/hello/'ve eko davranışını test edin. –

cevap

4

... denemek için başka bir şey bilmiyorum, benim müşterinin yönlendirici o bağlantı noktasını izin unuttum. (Çok kötü, 'u soruyu silemiyorum).