Netty wss socket socket drops connection

Intentando configurar el cliente básico de wss . El canal está activado, pero luego se desconecta inmediatamente sin exception.

Cliente:

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

Entrenador de animales:

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

El flujo de llamadas de controller:

 handleAdded channelRegistenetworking channelActive channelReadComplete channelInactive channelUnregistenetworking handlerRemoved 

¿Hay algo que extraño?

Olvidó agregar un SSLHandler , este controller es necesario porque se está conectando al puerto https (443), por lo que el server remoto espera que todo el tráfico se cifre. Enviar un post no encriptado al puerto https tiene un comportamiento indefinido, algunos serveres cerrarán su connection, otros serveres enviarán una networkingirección a https.

Puede agregar un sslhandler de la siguiente manera:

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())