【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();
    }
});
相关文章
|
21天前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
5月前
|
人工智能 监控 安全
NTP网络子钟的技术架构与行业应用解析
在数字化与智能化时代,时间同步精度至关重要。西安同步电子科技有限公司专注时间频率领域,以“同步天下”品牌提供可靠解决方案。其明星产品SYN6109型NTP网络子钟基于网络时间协议,实现高精度时间同步,广泛应用于考场、医院、智慧场景等领域。公司坚持技术创新,产品通过权威认证,未来将结合5G、物联网等技术推动行业进步,引领精准时间管理新时代。
|
1月前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
287 11
|
1月前
|
安全 网络性能优化 网络虚拟化
网络交换机分类与功能解析
接入交换机(ASW)连接终端设备,提供高密度端口与基础安全策略;二层交换机(LSW)基于MAC地址转发数据,构成局域网基础;汇聚交换机(DSW)聚合流量并实施VLAN路由、QoS等高级策略;核心交换机(CSW)作为网络骨干,具备高性能、高可靠性的高速转发能力;中间交换机(ISW)可指汇聚层设备或刀片服务器内交换模块。典型流量路径为:终端→ASW→DSW/ISW→CSW,分层架构提升网络扩展性与管理效率。(238字)
478 0
|
1月前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
180 0
|
2月前
|
XML JSON JavaScript
从解决跨域CSOR衍生知识 Network 网络请求深度解析:从快递系统到请求王国-优雅草卓伊凡
从解决跨域CSOR衍生知识 Network 网络请求深度解析:从快递系统到请求王国-优雅草卓伊凡
85 0
从解决跨域CSOR衍生知识 Network 网络请求深度解析:从快递系统到请求王国-优雅草卓伊凡
|
5月前
|
机器学习/深度学习 人工智能 算法
深度解析:基于卷积神经网络的宠物识别
宠物识别技术随着饲养规模扩大而兴起,传统手段存在局限性,基于卷积神经网络的宠物识别技术应运而生。快瞳AI通过优化MobileNet-SSD架构、多尺度特征融合及动态网络剪枝等技术,实现高效精准识别。其在智能家居、宠物医疗和防走失领域展现广泛应用前景,为宠物管理带来智能化解决方案,推动行业迈向新高度。
|
4月前
|
开发者
鸿蒙仓颉语言开发教程:网络请求和数据解析
本文介绍了在仓颉开发语言中实现网络请求的方法,以购物应用的分类列表为例,详细讲解了从权限配置、发起请求到数据解析的全过程。通过示例代码,帮助开发者快速掌握如何在网络请求中处理数据并展示到页面上,减少开发中的摸索成本。
鸿蒙仓颉语言开发教程:网络请求和数据解析
|
5月前
|
网络架构
广播域与冲突域:解析网络技术中的复杂性。
总的来说,理解广播域和冲突域的概念可以使我们在设计或维护网络的过程中,更有效地管理通信流程,避免出现网络瓶颈,提成整体网络性能。就像是如何有效地运作一个市场,把每个人的需求和在合适的时间和地点配对,确保每个人的声音都被听到,每个人的需求都被满足。
124 11
|
5月前
|
机器学习/深度学习 算法 测试技术
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
本文探讨了基于图的重排序方法在信息检索领域的应用与前景。传统两阶段检索架构中,初始检索速度快但结果可能含噪声,重排序阶段通过强大语言模型提升精度,但仍面临复杂需求挑战
150 0
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析

热门文章

最新文章

推荐镜像

更多
  • DNS