服务器建立sslConnection后如何在netty客户端上获取回调

Posted

技术标签:

【中文标题】服务器建立sslConnection后如何在netty客户端上获取回调【英文标题】:How to get callback on netty client after server establish sslConnection 【发布时间】:2017-06-14 08:34:24 【问题描述】:

我的服务器希望客户端连接到两个不同的套接字,连接顺序很重要。客户端必须在第一个通道ch1 上连接,并且在 SSL 握手之后服务器需要时间来创建用户会话。在 Handler 中是这样的:

    @Override
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception            
        log.debug("channelRegistered);
        ctx.pipeline().get(SslHandler.class).handshakeFuture().addListener(
                future -> initSession(ctx));
    

InitSession 方法创建内部对象来跟踪客户端。只有在 initSession 完成后,服务器才会期望来自该客户端的第二个通道 ch2 的连接。

我一直坚持编写客户端代码来执行此连接顺序。 天真的方法很简单:

public static void main(String[] args) throws Exception 
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try 
            SslContext sslContext = provideSslContext();
            Bootstrap b = new Bootstrap();
            b.group(workerGroup)
                    .channel(NiosocketChannel.class)
            .handler(new Channelinitializer(sslContext));

            Channel ch1 = b.connect("localhost", 8008).sync().channel();

            Thread.sleep(1000);

            Bootstrap b1 = new Bootstrap();
            b1.group(workerGroup)
                    .channel(NioSocketChannel.class)
                    .handler(new Channelinitializer(sslContext));

            Channel ch2 = b1.connect("localhost", 8009).sync().channel();
        finally 
            workerGroup.shutdownGracefully();
        
    

ch1 连接之后,我们只需等待一段时间以确保服务器执行所需的所有操作。 强大的解决方案应该是什么样子?有什么回调可以用来触发ch2 连接吗?我正在使用 netty 4.0.36.Final

【问题讨论】:

【参考方案1】:

您可以从管道中检索 SslHandler 并等待 handshakeFuture 或向其添加侦听器。然后在完成后进行第二次连接。

类似:

 SslContext sslContext = provideSslContext();
 Bootstrap b = new Bootstrap();
 b.group(workerGroup)
        .channel(NioSocketChannel.class)
        .handler(new Channelinitializer(sslContext));

 Channel ch1 = b.connect("localhost", 8008).sync().channel();
 ch1.pipeline.get(SslHandler.class).handshakeFuture().sync()

 Bootstrap b1 = new Bootstrap();
 b1.group(workerGroup)
        .channel(NioSocketChannel.class)
        .handler(new Channelinitializer(sslContext));

 Channel ch2 = b1.connect("localhost", 8009).sync().channel();

【讨论】:

以上是关于服务器建立sslConnection后如何在netty客户端上获取回调的主要内容,如果未能解决你的问题,请参考以下文章

建立 SSL 连接时,PKIX 路径构建失败

如何在 Node.js 中与 Net 建立持久连接?

vs2005如何建立一个WEB站点?

ASP.NET Core管道深度剖析:管道是如何建立起来的?

asp.net调用javascript返回值

ASP NET 是啥?