in dubbo-remoting-extensions/dubbo-remoting-quic/src/main/java/org/apache/dubbo/remoting/transport/quic/QuicNettyClient.java [110:154]
protected void doConnect() throws Throwable {
logger.info("quic client do connect");
final QuicNettyClientHandler nettyClientHandler = new QuicNettyClientHandler(getUrl(), this);
InetSocketAddress address = getConnectAddress();
logger.info("quic connect address:" + address);
QuicChannel quicChannel = QuicChannel.newBootstrap(qchannel)
.streamHandler(new ChannelInboundHandlerAdapter() {
@Override
public void channelActive(ChannelHandlerContext ctx) {
ctx.close();
}
})
.remoteAddress(address)
.connect()
.get(5, TimeUnit.SECONDS);
this.schannel = quicChannel.createStream(QuicStreamType.BIDIRECTIONAL,
new ChannelInitializer<QuicStreamChannel>() {
@Override
protected void initChannel(QuicStreamChannel quicStreamChannel) throws Exception {
NettyCodecAdapter adapter = new NettyCodecAdapter(getCodec(), getUrl(), QuicNettyClient.this);
int heartbeatInterval = UrlUtils.getHeartbeat(getUrl());
quicStreamChannel.pipeline().addLast(
new ChannelInboundHandlerAdapter() {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
if (evt == ChannelInputShutdownReadComplete.INSTANCE) {
((QuicChannel) ctx.channel().parent()).close(true, 0,
ctx.alloc().directBuffer(16)
.writeBytes(new byte[]{'k', 't', 'h', 'x', 'b', 'y', 'e'}));
}
}
}
)
.addLast("decoder", adapter.getDecoder())
.addLast("encoder", adapter.getEncoder())
.addLast("client-idle-handler", new IdleStateHandler(heartbeatInterval, 0, 0, TimeUnit.MILLISECONDS))
.addLast("handler", nettyClientHandler);
;
}
}
).sync().getNow();
}