Netty:当Channel将数据发送成功以后,存放发送数据的ByteBuf会被自动释放

news/2024/12/1 12:53:46/

说明

使用Netty框架编程,当Channel将数据发送成功以后,存放发送数据的ByteBuf会被自动释放。
为了进行验证,我们可以在发送数据前,通过io.netty.buffer.ByteBuf的refCnt()函数看看引用计数,通过Channel发送成功以后再看看引用计数,对比下。

示例

为了突出重点,此处只给出代码片段。

package com.thb.power.terminal;import java.io.BufferedReader;
import java.io.InputStreamReader;import com.thb.power.packet.register.RegisterRequestPacket;import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;/*** 客户端主函数* @author thb**/
public class Terminal {// 要连接的服务端的host static final String HOST = System.getProperty("host", "127.0.0.1"); // 要连接的服务端的端口号 static final int PORT = Integer.parseInt(System.getProperty("port", "22335"));public static void main(String[] args) throws Exception {// 配置客户端EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true).handler(new TerminalInitializer());// 启动客户端Channel ch = b.connect(HOST, PORT).sync().channel();//System.out.println("channel: " + ch.getClass().getName());ChannelFuture lastWriteFuture = null;BufferedReader in = new BufferedReader(new InputStreamReader(System.in));System.out.println("please input(register):");for (;;) {String line = in.readLine();if (line == null) {break;}				// 如果用户输入register,表示命令客户端发送注册请求给服务器if (line.toLowerCase().equals("register")) {RegisterRequestPacket registerRequest = new RegisterRequestPacket();// 返回的ByteBuf存放着注册请求的数据ByteBuf buf = registerRequest.build(ch);// 发送数据前,看看引用计数System.out.println("before write and flush, buf.refCnt(): " + buf.refCnt());lastWriteFuture = ch.writeAndFlush(buf);lastWriteFuture.addListener(new ChannelFutureListener() {public void operationComplete(ChannelFuture future) {// 发送数据成功以后,再看看引用计数System.out.println("after write and flush completed, buf.refCnt(): " + buf.refCnt());}});}}if (lastWriteFuture != null) {lastWriteFuture.sync();}} finally {// 关闭event loop以便终止所有的线程group.shutdownGracefully();}}}// ChannelInitializer的子类
package com.thb.power.terminal;import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;public class TerminalInitializer extends ChannelInitializer<SocketChannel> {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline p = ch.pipeline();p.addLast(new LoggingHandler(LogLevel.INFO));}
}

运行输出结果:
在这里插入图片描述

从上面输出的打印信息可以看出,发送数据前,引用计数是1,发送数据成功后,引用计数变为0,被释放了。


http://www.ppmy.cn/news/1010745.html

相关文章

map和set的使用总结

目录 一、关联式容器二、键值对三、树形结构的关联式容器3.1 set3.1.1 set介绍3.1.2 set的模板参数列表3.1.3 set的使用实例 3.2 map3.2.1 map的介绍3.2.2 map的参数列表说明3.2.3 map的operator[]&#xff08;very very very好用&#xff0c;map的精华&#xff09;3.2.4 map的…

蓝桥杯上岸考点清单 (冲刺版)!!!

大家好 我是寸铁&#x1f4aa; 真题千千万万遍&#xff0c;蓝桥省一自然现&#xff01; ✌️ 日更3000里&#xff0c;蓝桥眷顾你 &#x1f31f; 暴力出奇迹&#xff0c;打表过样例 &#x1f44a; 冲刺蓝桥杯省一模板大全来啦 &#x1f525; 蓝桥杯4月8号就要开始了 &#…

io day8 ipc机制

1.要求实现AB进程对话 a.A进程先发送一句话给B进程&#xff0c;B进程接收后打印 b.B进程再回复一句话给A进程&#xff0c;A进程接收后打印 c.重复1.2步骤&#xff0c;当收到quit后&#xff0c;要结束AB进程 d.提示:两根管道

Python 文件操作详解

概要 Python进行文件操作&#xff0c;在日常编程中是很常用的。为了方便大家&#xff0c;这里对各种文件操作的知识进行汇总。一文在手&#xff0c;无须它求&#xff01;来一起学习吧。 一、文件的打开和关闭 open()函数 f1 open(rd:\测试文件.txt, moder, encodingutf-8) c…

SolidUI社区-FAQ解答问题流程

背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…

STM32CubeMx之FreeRTOS的中断优先级+配置

编译运行即可 例如我编写的是一个灯亮500ms 一个等200ms的亮灭 如果他们的优先级是同等的&#xff0c;那么任务都可以实现&#xff0c;时间片会自动切换 但是如果亮500ms的灯 任务优先级更高 还用HALdelay的话 就会让任务二饿死&#xff0c;从而就会只看到任务一的内容 解…

HTTP——十、构建Web内容的技术

HTTP 一、HTML1、Web页面几乎全由HTML构建2、HTML的版本3、设计应用CSS 二、动态HTML1、让Web页面动起来的动态HTML2、更易控制HTML的DOM 三、Web应用1、通过Web提供功能的Web应用2、与Web服务器及程序协作的CGI3、因Java而普及的Servlet 四、数据发布的格式及语言1、可扩展标记…

AlmaLinux 9 安装 Go 1.20

AlmaLinux 9 安装 Golang 1.20 1. 下载 go 安装包2. 安装 go3. 配置环境变量4. 确认 go 版本 1. 下载 go 安装包 访问 https://go.dev/dl/&#xff0c;下载你想安装的版本&#xff0c;比如 go1.20.7.linux-amd64.tar.gz&#xff0c; 2. 安装 go (可选)删除旧版本&#xff0c;…