2016-07-01 13 views
2

Ich habe ein Echo-Server Beispiel von Official Netty Echo ServerNetty 4.x.x WebSocket-Handshake für Streaming-Server

Wie Fähigkeit hinzufügen, um es von websocket zu verbinden und Streaming?

hier ist mein ServerHandler Code:

public class ServerHandler extends ChannelInboundHandlerAdapter 
{ 
    @Override 
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception { 
     super.channelRegistered(ctx); 
     // !!!!! Think here should be WebSocket Handshake? 
    } 

    @Override 
    public void channelRead(ChannelHandlerContext ctx, Object msg) 
    { 
     System.out.println(msg); 
     ctx.write(msg); 
    } 

    @Override 
    public void channelReadComplete(ChannelHandlerContext ctx) 
    { 
     ctx.flush(); 
    } 

    @Override 
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 
    { 
      // Close the connection when an exception is raised. 
     cause.printStackTrace(); 
    } 
} 

jetzt rechts Chrome Verbindung sagt: WebSocket-Verbindung zu 'ws: //127.0.0.1: 8080 /' ist fehlgeschlagen: Fehler bei der WebSocket-Handshake: Ungültige Statuszeile

Antwort

0

Also, ich habe eine Lösung gefunden! Es ist nicht kompatibel mit der nativen Dokumentation von Web-Socket, aber wen interessiert es, es funktioniert so, wie ich es erwartet habe!

public void channelRead(ChannelHandlerContext ctx, Object msg) 
    { 
     DefaultHttpRequest httpRequest = null; 
     if (msg instanceof DefaultHttpRequest) 
     { 
      httpRequest = (DefaultHttpRequest) msg; 

      // Handshake 
      WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory("ws://127.0.0.1:8080/", null, false); 
      final Channel channel = ctx.channel(); 
      final WebSocketServerHandshaker handshaker = wsFactory.newHandshaker(httpRequest); 

      if (handshaker == null) { 

      } else { 
       ChannelFuture handshake = handshaker.handshake(channel, httpRequest); 
      } 
     } 
    } 

Vergessen Sie nicht,

p.addLast(new HttpRequestDecoder(4096, 8192, 8192, false)); 
p.addLast(new HttpResponseEncoder()); 

zu Ihrer Pipeline hinzuzufügen.

1

Netty-Server verarbeiten nicht automatisch alle Protokolle, daher müssen Sie Unterstützung für WebSockets hinzufügen.

Ich finde den besten Platz, um zu beginnen, ist, die relevanten Beispiele in Nettys xref Seite zu untersuchen. Scrollen Sie die Paketliste herunter, bis Sie zu den Paketen io.netty.example gelangen. In dieser Liste finden Sie ein Paket namens io.netty.example.http.websocketx.server. Es gibt ein recht einfaches und gut durchdachtes Beispiel für die Implementierung eines Websocket-Servers oder nur des Handlers.

Websocket-Server sind etwas komplizierter als andere Server, da sie als HTTP-Server gestartet werden müssen, da das Protokoll angibt, dass Websockets durch "Aktualisieren" einer HTTP-Verbindung initiiert werden müssen, aber wie oben erwähnt Das ist ziemlich klar.