【Netty 网络通信】ChannelFuture 解析

简介: 【1月更文挑战第9天】【Netty 网络通信】ChannelFuture 解析

在客户端代码中:

ChannelFuture channelFuture = new Bootstrap()
    .group(new NioEventLoopGroup())
    .channel(NioSocketChannel.class)
    // 添加处理器:
    .handler(new ChannelInitializer<NioSocketChannel>() {
        // 连接建立完成之后被调用:
        @Override
        protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
            nioSocketChannel.pipeline().addLast(new StringEncoder());
        }
    })
    // 连接到服务器:
    .connect("localhost", 8080);

调用了connect()方法,绑定了服务端的IP地址和端口号之后,返回的是一个ChannelFuture对象。同时connect()是一个异步非阻塞方法,是由main主线程进行调用执行,而真正执行的是由其他NIO线程执行创建这个ChannelFuture对象。所以,如果不调用channelFuture.sync();阻塞等待,直接通过channel()方法获取Channel对象发送数据的话,服务端无法正常接收数据。

无法接受数据的原因是因为,创建线程的动作真正执行的不是main主线程,所以当进行连接连接后,main主线程无法得知客户端与服务端之间的连接是否已经建立完成,而是无阻塞的向下继续运行获取Channel对象。

注意:如果类名带有Future或者Promise一般都需要配合异步方法进行执行,用于正确处理结果。

2.2.1 Sync 同步处理:

channelFuture.sync();

使用sync()方法同步处理结果,也就是当主线程执行当前方法后,会阻塞当前线程,等待其他的NIO线程完成客户端和服务端之间的连接建立完毕。

2.2.2 addLinstener 异步处理:

channelFuture.addListener(回调对象);

调用ChannelFutureaddLinstener()方法异步执行处理结果。

// 异步处理结果:
channelFuture.addListener(new ChannelFutureListener() {
    // 在NIO线程把客户端与服务端之间的连接建立完成之后,就会调用operationComplete方法:
    @Override
    public void operationComplete(ChannelFuture channelFuture) throws Exception {
        // 在这个方法体中完成回调逻辑的处理:
        Channel channel = channelFuture.channel();
        channel.writeAndFlush("hello !");
    }
});

2.2.3 Channel 关闭:

// 获取到关闭ChannelFuture对象:
ChannelFuture closeFuture = channel.close();

有两种方式可以实现对Channel的关闭操作:使用sync()方法同步处理关闭;使用closeFuture也就是ChannelFuture对象实现异步处理关闭:

closeFuture.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture channelFuture) throws Exception {
        // 处理关闭后操作
    }
});

此时,在NioEventLoopGroup中还有线程其实是未被关闭释放的,此时需要进行优雅关闭:

// 创建NioEventLoopGroup:
NioEventLoopGroup group = new NioEventLoopGroup();
closeFuture.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture channelFuture) throws Exception {
        // 在这个回调方法中执行优雅关闭:
        group.shutdownGracefully();
    }
});
相关文章
|
24天前
|
机器学习/深度学习 算法 PyTorch
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
179 1
|
27天前
|
缓存 网络协议 Linux
【Shell 命令集合 网络通讯 】Linux 配置DNS dnsconf 命令 使用教程
【Shell 命令集合 网络通讯 】Linux 配置DNS dnsconf 命令 使用教程
38 0
|
7天前
|
存储 安全 测试技术
网络奇谭:虚拟机中的共享、桥接与Host-Only模式解析
网络奇谭:虚拟机中的共享、桥接与Host-Only模式解析
14 0
|
25天前
|
SQL 安全 网络安全
构筑数字堡垒:网络安全漏洞解析与防御策略
在数字化时代,网络安全已成为维护信息完整性、保障用户隐私和确保商业连续性的关键。本文将深入探讨网络安全领域的核心议题—安全漏洞及其防御机制。通过分析常见网络攻击手段,如SQL注入、跨站脚本攻击(XSS)及拒绝服务(DoS)攻击,揭示其背后的原理与潜在危害。同时,文章将重点介绍加密技术的种类和应用场景,以及如何通过强化安全意识,构建多层次的防御体系来有效预防和应对网络安全威胁。本研究旨在为读者提供一份系统性的网络安全防护指南,帮助个人和组织在不断演变的威胁面前保持警惕,并采取适当的安全措施。
19 2
|
30天前
|
域名解析 缓存 网络协议
探索Qt 网络编程:网络地址与服务类全解析
探索Qt 网络编程:网络地址与服务类全解析
54 0
|
1月前
|
数据采集 前端开发 JavaScript
Java网络爬虫实践:解析微信公众号页面的技巧
Java网络爬虫实践:解析微信公众号页面的技巧
|
1月前
|
运维 监控 网络虚拟化
|
2月前
|
域名解析 缓存 网络协议
|
2月前
|
域名解析 弹性计算 缓存
DNS问题之无法通过域名访问如何解决
DNS服务器是负责将域名转换为IP地址的服务,它是互联网上实现域名解析的关键基础设施;本合集将探讨DNS服务器的工作原理、配置方法和常见问题处理,帮助用户理解和优化DNS服务的使用。
70 2
|
2月前
|
前端开发 网络安全 网络架构
【华为数通HCIP | 网络工程师】821-BGP 组播高频题与解析(1)
【华为数通HCIP | 网络工程师】821-BGP 组播高频题与解析(1)
99 0

推荐镜像

更多