2017-08-15 20 views
0

基本的なセットアップを試行中wssクライアント。チャネルはアクティブになりますが、例外なくすぐに切断されます。Netty wssソケットクライアント接続が切断されます

クライアント:

class WebSocketClient(val uri: String) { 

    lateinit var ch: Channel 

    fun connect() { 
     val bootstrap = Bootstrap() 
     val uri: URI = URI.create(uri) 
     val handler = WebSocketClientHandler(WebSocketClientHandshakerFactory.newHandshaker(uri, WebSocketVersion.V13, null, false, HttpHeaders.EMPTY_HEADERS, 1280000)) 

     bootstrap.group(NioEventLoopGroup()) 
       .channel(NioSocketChannel::class.java) 
       .handler(object : ChannelInitializer<SocketChannel>() { 
        override fun initChannel(ch: SocketChannel) { 
         val pipeline = ch.pipeline() 
         pipeline.addLast("http-codec", HttpClientCodec()) 
         pipeline.addLast("aggregator", HttpObjectAggregator(65536)) 
         pipeline.addLast("ws-handler", handler) 
        } 
       }) 
     ch = bootstrap.connect(uri.host, 443).sync().channel() 
     handler.channelPromise.sync() 
    } 
} 

ハンドラ:

class WebSocketClientHandler(val handShaker: WebSocketClientHandshaker) : SimpleChannelInboundHandler<Any>() { 

    lateinit var channelPromise: ChannelPromise 

    override fun handlerAdded(ctx: ChannelHandlerContext) { 
     channelPromise = ctx.newPromise() 
    } 

    override fun channelActive(ctx: ChannelHandlerContext) { 
     handShaker.handshake(ctx.channel()) 
    } 

    override fun channelRead0(ctx: ChannelHandlerContext, msg: Any) { 
     val ch = ctx.channel() 
     if (!handShaker.isHandshakeComplete) { 
      handShaker.finishHandshake(ch, msg as FullHttpResponse) 
      channelPromise.setSuccess() 
      return 
     } 

     val frame = msg as WebSocketFrame 
     if (frame is TextWebSocketFrame) { 
      println("text message: $frame") 
     } else if (frame is PongWebSocketFrame) { 
      println("pont message") 
     } else if (frame is CloseWebSocketFrame) { 
      ch.close() 
     } else { 
      println("unhandled frame: $frame") 
     } 
    } 
} 

ハンドラの流れを呼び出す:私は欠場何かが

handleAdded 
channelRegistered 
channelActive 
channelReadComplete 
channelInactive 
channelUnregistered 
handlerRemoved 

ありますか?

+0

どのようにあなたのグループ変数を作るのですか? – Ferrybig

+0

@Ferrybigがコードを更新しました。 'group'について特別なことはなく、' NioEventLoopGroup'の新しいインスタンスを作成するだけです。 – eleven

答えて

1

SSLHandlerを追加するのを忘れた場合、httpsポート(443)に接続しているため、このハンドラが必要です。リモートサーバーはすべてのトラフィックを暗号化すると見なします。暗号化されていないメッセージをhttpsポートに送信すると、定義されていない動作が発生します。一部のサーバーは接続をシャットダウンし、他のサーバーはhttpsにリダイレクトします。

あなたは、以下の方法を使用してsslhandlerを追加することができます。

のjava:

final SslContext sslCtx = SslContextBuilder.forClient() 
// .trustManager(InsecureTrustManagerFactory.INSTANCE) 
    .build(); 

pipeline.addLast("ssl-handler", sslCtx.newHandler(ch.alloc(), url.getHost(), 443)); 

// Your remaining code.... 
pipeline.addLast("http-codec", new HttpClientCodec()) 
+0

素敵な説明!実際に 'ssl-handler'が必要です。ありがとう。 – eleven

関連する問題