Netty入门学习笔记(三)

netty学习笔记-01 netty学习笔记 阅读详情

阶段三:高级特性

在这个阶段,我们将学习Netty的高级特性,包括自定义编解码器、入站/出站处理器、UDP通信和HTTP服务器。

项目 1-09:自定义编解码器

📌 项目目标

学习如何自定义编解码器,实现自定义协议的编解码。

🔑 核心知识点
  1. ByteToMessageDecoder:字节到消息的解码器基类

    • 重写decode()方法
    • 处理TCP粘包/拆包
  2. MessageToByteEncoder:消息到字节的编码器基类

    • 重写encode()方法
    • 将对象编码为字节
  3. 自定义协议:定义消息格式

    • 消息头:长度字段
    • 消息体:实际数据
💻 核心代码解析

MyDecoder.java - 自定义解码器

public class MyDecoder extends ByteToMessageDecoder {
    
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
        // 1. 判断是否有足够的数据(至少4字节的长度字段)
        if (in.readableBytes() < 4) {
            return;
        }
        
        // 2. 标记当前读取位置
        in.markReaderIndex();
        
        // 3. 读取消息长度
        int dataLength = in.readInt();
        
        // 4. 判断是否有足够的数据
        if (in.readableBytes() < dataLength) {
            // 数据不完整,重置读取位置,等待更多数据
            in.resetReaderIndex();
            return;
        }
        
        // 5. 读取消息体
        byte[] data = new byte[dataLength];
        in.readBytes(data);
        
        // 6. 将解码后的消息添加到输出列表
        String message = new String(data, Charset.forName("GBK"));
        out.add(message);
    }
}

MyEncoder.java - 自定义编码器

public class MyEncoder extends MessageToByteEncoder<String> {
    
    @Override
    protected void encode(ChannelHandlerContext ctx, String msg, ByteBuf out) {
        // 1. 将消息转换为字节数组
        byte[] data = msg.getBytes(Charset.forName("GBK"));
        
        // 2. 写入消息长度(4字节)
        out.writeInt(data.length);
        
        // 3. 写入消息体
        out.writeBytes(data);
    }
}

MyChannelInitializer.java - 使用自定义编解码器

@Override
protected void initChannel(SocketChannel channel) {
    // 自定义解码器
    channel.pipeline().addLast(new MyDecoder());
    
    // 自定义编码器
    channel.pipeline().addLast(new MyEncoder());
    
    // 业务处理器
    channel.pipeline().addLast(new MyServerHandler());
}
🎯 运行效果
  • 使用自定义协议进行通信
  • 消息格式:[长度(4字节)][消息体]
  • 自动处理粘包/拆包问题
📊 自定义协议格式
+--------+----------------+
| Length |     Data       |
| 4 bytes|  N bytes       |
+--------+----------------+
💡 自定义编解码器的应用
  • 实现私有协议
  • 提高传输效率
  • 增强安全性
  • 支持复杂的数据结构

项目 1-10:入站/出站处理器

📌 项目目标

学习Netty的入站(Inbound)和出站(Outbound)处理器,理解Pipeline的双向处理机制。

🔑 核心知识点
  1. ChannelInboundHandler:入站处理器

    • 处理接收的数据(从Socket读取)
    • 方法:channelRead()、channelActive()等
  2. ChannelOutboundHandler:出站处理器

    • 处理发送的数据(写入Socket)
    • 方法:write()、flush()等
  3. Pipeline执行顺序:

    • 入站:从前往后执行
    • 出站:从后往前执行
  4. 处理器链:多个处理器组成处理链

💻 核心代码解析

MyInMsgHandler.java - 入站处理器

public class MyInMsgHandler extends ChannelInboundHandlerAdapter {
    
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("【入站处理器1】接收到消息:" + msg);
        
        // 将消息传递给下一个入站处理器
        ctx.fireChannelRead(msg);
    }
}

MyOutMsgHandler.java - 出站处理器

public class MyOutMsgHandler extends ChannelOutboundHandlerAdapter {
    
    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
        System.out.println("【出站处理器1】发送消息:" + msg);
        
        // 将消息传递给下一个出站处理器
        ctx.write(msg, promise);
    }
}

MyChannelInitializer.java - 配置处理器链

@Override
protected void initChannel(SocketChannel channel) {
    // 入站处理器(从前往后执行)
    channel.pipeline().addLast("inHandler1", new MyInMsgHandler());
    channel.pipeline().addLast("inHandler2", new MyInMsgHandler());
    
    // 出站处理器(从后往前执行)
    channel.pipeline().addLast("outHandler1", new MyOutMsgHandler());
    channel.pipeline().addLast("outHandler2", new MyOutMsgHandler());
    
    // 业务处理器
    channel.pipeline().addLast(new MyClientHandler());
}
🎯 运行效果

接收数据时(入站):

【入站处理器1】接收到消息:Hello
【入站处理器2】接收到消息:Hello

发送数据时(出站):

【出站处理器2】发送消息:World
【出站处理器1】发送消息:World
📊 Pipeline执行流程
接收数据(入站):
Socket → 入站处理器1 → 入站处理器2 → 业务处理器

发送数据(出站):
业务处理器 → 出站处理器2 → 出站处理器1 → Socket
💡 应用场景
  • 入站处理器:解码、日志记录、权限验证
  • 出站处理器:编码、加密、压缩
  • 处理器链:实现复杂的业务逻辑

项目 1-11:UDP通信实现

📌 项目目标

学习如何使用Netty实现UDP通信(无连接的数据报协议)。

🔑 核心知识点
  1. UDP vs TCP:

    • UDP:无连接、不可靠、快速
    • TCP:面向连接、可靠、慢
  2. NioDatagramChannel:UDP通信的Channel类型

  3. DatagramPacket:UDP数据包

    • 包含数据和目标地址
  4. UDP特点:

    • 不需要建立连接
    • 不保证数据到达
    • 适合实时性要求高的场景
💻 核心代码解析

NettyServer.java - UDP服务端

private void bing(int port) {
    EventLoopGroup group = new NioEventLoopGroup();
    
    try {
        Bootstrap b = new Bootstrap();
        b.group(group)
                .channel(NioDatagramChannel.class)  // 使用UDP Channel
                .option(ChannelOption.SO_BROADCAST, true)  // 支持广播
                .handler(new MyChannelInitializer());
        
        // UDP使用bind()而不是connect()
        ChannelFuture f = b.bind(port).sync();
        System.out.println("UDP服务端启动成功,端口:" + port);
        
        f.channel().closeFuture().sync();
        
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        group.shutdownGracefully();
    }
}

MyServerHandler.java - UDP消息处理

public class MyServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
    
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) {
        // 1. 读取UDP数据包
        ByteBuf buf = packet.content();
        byte[] data = new byte[buf.readableBytes()];
        buf.readBytes(data);
        String message = new String(data, Charset.forName("GBK"));
        
        System.out.println("收到UDP消息:" + message);
        System.out.println("发送方地址:" + packet.sender());
        
        // 2. 回复UDP消息
        String response = "服务端收到:" + message;
        ByteBuf responseBuf = Unpooled.copiedBuffer(
            response.getBytes(Charset.forName("GBK"))
        );
        
        // 3. 创建UDP数据包并发送
        DatagramPacket responsePacket = new DatagramPacket(
            responseBuf,
            packet.sender()  // 发送到原地址
        );
        ctx.writeAndFlush(responsePacket);
    }
}
🎯 运行效果
  • UDP服务端能够接收和发送数据报
  • 不需要建立连接,直接收发数据
  • 适合实时性要求高的场景
📊 TCP vs UDP对比
特性TCPUDP
连接面向连接无连接
可靠性可靠传输不可靠
速度较慢较快
顺序保证顺序不保证
应用场景文件传输、HTTP视频直播、游戏
💡 UDP应用场景
  • 视频直播:实时性要求高
  • 在线游戏:低延迟
  • DNS查询:快速响应
  • 语音通话:实时通信

项目 1-12:HTTP服务器实现

📌 项目目标

学习如何使用Netty实现一个简单的HTTP服务器,能够接收HTTP请求并返回HTTP响应。

🔑 核心知识点
  1. HttpRequestDecoder:HTTP请求解码器

    • 将字节流解码为HttpRequest和HttpContent对象
  2. HttpResponseEncoder:HTTP响应编码器

    • 将HttpResponse对象编码为字节流
  3. HTTP消息结构:

    • HttpRequest:请求行 + 请求头
    • HttpContent:请求体
    • LastHttpContent:请求结束标记
  4. FullHttpResponse:完整的HTTP响应

    • 包含响应行、响应头、响应体
💻 核心代码解析

MyChannelInitializer.java - HTTP编解码器配置

@Override
protected void initChannel(SocketChannel channel) {
    // 1. HTTP响应编码器(出站)
    channel.pipeline().addLast(new HttpResponseEncoder());
    
    // 2. HTTP请求解码器(入站)
    channel.pipeline().addLast(new HttpRequestDecoder());
    
    // 3. 业务处理器
    channel.pipeline().addLast(new MyServerHandler());
}

MyServerHandler.java - HTTP请求处理

public class MyServerHandler extends ChannelInboundHandlerAdapter {
    
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        
        // 处理HTTP请求行和请求头
        if (msg instanceof HttpRequest) {
            DefaultHttpRequest request = (DefaultHttpRequest) msg;
            System.out.println("URI:" + request.getUri());
            System.out.println("请求方法:" + request.method());
        }
        
        // 处理HTTP请求体
        if (msg instanceof HttpContent) {
            LastHttpContent httpContent = (LastHttpContent) msg;
            ByteBuf byteData = httpContent.content();
            
            if (!(byteData instanceof EmptyByteBuf)) {
                byte[] msgByte = new byte[byteData.readableBytes()];
                byteData.readBytes(msgByte);
                System.out.println("请求体:" + new String(msgByte, Charset.forName("UTF-8")));
            }
        }
        
        // 构造HTTP响应
        String responseContent = "Hello from Netty HTTP Server!";
        
        FullHttpResponse response = new DefaultFullHttpResponse(
                HttpVersion.HTTP_1_1,
                HttpResponseStatus.OK,
                Unpooled.wrappedBuffer(responseContent.getBytes(Charset.forName("UTF-8")))
        );
        
        // 设置响应头
        response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain;charset=UTF-8");
        response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
        response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
        
        // 发送响应
        ctx.write(response);
        ctx.flush();
    }
    
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();
    }
    
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
        cause.printStackTrace();
    }
}

NettyServer.java - HTTP服务器启动

private void bing(int port) {
    EventLoopGroup parentGroup = new NioEventLoopGroup();
    EventLoopGroup childGroup = new NioEventLoopGroup();
    
    try {
        ServerBootstrap b = new ServerBootstrap();
        b.group(parentGroup, childGroup)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG, 128)
                .childOption(ChannelOption.SO_KEEPALIVE, true)  // HTTP长连接
                .childHandler(new MyChannelInitializer());
        
        ChannelFuture f = b.bind(port).sync();
        System.out.println("HTTP服务器启动成功,端口:" + port);
        
        f.channel().closeFuture().sync();
        
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        childGroup.shutdownGracefully();
        parentGroup.shutdownGracefully();
    }
}
🎯 运行效果
  • 启动HTTP服务器后,在浏览器访问:http://localhost:7397
  • 浏览器显示:Hello from Netty HTTP Server!
  • 服务端控制台打印请求信息
📊 HTTP消息处理流程
客户端请求:
浏览器 → HTTP请求字节流 → HttpRequestDecoder → HttpRequest对象 → 业务处理器

服务端响应:
业务处理器 → FullHttpResponse对象 → HttpResponseEncoder → HTTP响应字节流 → 浏览器
💡 HTTP服务器应用
  • RESTful API服务
  • Web应用后端
  • 微服务网关
  • 静态文件服务器

总结与展望

🎓 知识体系总结

通过这12个项目的学习,我们完整地掌握了Netty的核心知识体系:

1. 核心组件掌握
组件作用关键点
EventLoopGroup事件循环组Boss线程组 + Worker线程组
Bootstrap启动辅助类ServerBootstrap(服务端)、Bootstrap(客户端)
Channel网络通信载体NioServerSocketChannel、NioSocketChannel、NioDatagramChannel
ChannelPipeline处理器链入站从前往后,出站从后往前
ChannelHandler业务处理器Inbound(入站)、Outbound(出站)
ByteBuf字节缓冲区比ByteBuffer更强大
ChannelGroupChannel组管理多个Channel,实现群发
2. 编解码技术

内置编解码器:

  • LineBasedFrameDecoder:基于换行符
  • StringDecoder/StringEncoder:字符串编解码
  • HttpRequestDecoder/HttpResponseEncoder:HTTP编解码

自定义编解码器:

  • ByteToMessageDecoder:自定义解码器
  • MessageToByteEncoder:自定义编码器
  • 实现私有协议
3. 通信协议支持
协议Channel类型特点应用场景
TCPNioSocketChannel可靠、有序文件传输、HTTP
UDPNioDatagramChannel快速、无连接视频直播、游戏
HTTPNioSocketChannel + HTTP编解码器应用层协议Web服务、API
4. 学习路径回顾
阶段一:服务端基础
├─ 1-01:理解Netty启动流程
├─ 1-02:手动解码(理解底层原理)
├─ 1-03:内置解码器(简化开发)
├─ 1-04:手动编码(理解底层原理)
├─ 1-05:内置编码器(简化开发)
└─ 1-06:ChannelGroup(群发消息)

阶段二:客户端实现
├─ 1-07:客户端启动流程
└─ 1-08:完整的收发功能

阶段三:高级特性
├─ 1-09:自定义编解码器(私有协议)
├─ 1-10:入站/出站处理器(Pipeline机制)
├─ 1-11:UDP通信(无连接协议)
└─ 1-12:HTTP服务器(应用层协议)

📈 知识演进图

项目1-01:最基础的服务端(只能监听连接)
    ↓
项目1-02:手动解码接收数据(理解ByteBuf)
    ↓
项目1-03:使用内置解码器(简化开发)
    ↓
项目1-04:手动编码发送数据(理解编码原理)
    ↓
项目1-05:使用内置编码器(代码最优雅)
    ↓
项目1-06:群发消息(ChannelGroup)
    ↓
项目1-07:实现客户端(理解客户端与服务端区别)
    ↓
项目1-08:完整的客户端(双向通信)
    ↓
项目1-09:自定义编解码器(私有协议)
    ↓
项目1-10:入站/出站处理器(Pipeline机制)
    ↓
项目1-11:UDP通信(无连接协议)
    ↓
项目1-12:HTTP服务器(应用层协议)

🎯 结语

Netty是一个强大的网络编程框架,通过这12个项目的学习,我们从零开始,逐步掌握了Netty的核心知识和实战技能。

希望这份学习笔记能够帮助你快速入门Netty,开启网络编程的精彩之旅!

超详细Netty入门,看这篇就够了! 思维导图 前言 本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。 一、Netty概述 官方的介绍: Netty isan asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & .. 阅读详情

相关推荐

【Netty入门教程】Netty基础篇之入门详情介绍

本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。 Netty是 一个异步事件驱动的网络应用程序框架,用于**快速开发可维护的高性能协议服务器和客户端。 Netty是一个NIO客户端-服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它大大简化和简化了TCP和UDP套接字服务器等网络编程。

No8g攻城狮的博客 1648

Netty私人学习笔记

如果是直接内存DirectByteBuf,则记录的是内存地址的起始位置,然后通过sun.misc.Unsafe来反复使用使用申请的这块内存(申请的内存虚拟地址是连续的,只需要记录起始位置,就可以计算出整片内存的地址,JDK的DirectByteBuffer也是直接用Unsafe通过内存地址来直接读写,不过不会重复使用),从而达到复用,不需要反复申请新的内存空间。11、Netty的异步非阻塞实现,底层是基于JDK的NIO(即Selector)为核心进行开发的,并不是使用JDK的AIO模型。

奕辰杰的博客 1132

从硬件异常到代码救赎:RH850内存访问错误(MAE)的深层诊断与艺术

本文深入探讨瑞萨RH850微控制器的内存访问错误(MAE)诊断与解决方法。针对程序跑飞和Flash Driver交互中的潜在陷阱,提供系统性硬件异常分析框架和防御性编程实践,帮助嵌入式开发者从底层机制到代码层面有效预防和修复MAE问题,提升系统稳定性。

pytorch8learner的博客 197

Netty网络编程学习笔记(三)——入门篇

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端他还是另一个著名网络应用框架 Mina 的重要贡献者Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位以下的框架都使用了 Netty,因为它们有网络通信需求!开发一个简单的服务器端和客户端加入依赖 2.2 服务器端 代码解读1 处,创建 NioEventLoopGroup,可以简单理解为 后面会详细展开2 处,选择服务 Scoket 实现类,其中 Nio

程哥哥的一亩三分地 484

睿尔曼超轻量仿人机械臂-ROS第一篇 启动机械臂的Moveit

本文主要讲述了睿尔曼六轴机械臂在ROS中的功能包配置,及如何根据文件启动Moveit做仿真。

realman_Rop的博客 7490

Win10系统权限深度解析:如何安全地将C盘所有者从TrustedInstaller变更为Administrators

本文深入解析了Win10系统中C盘文件权限管理的核心机制,解释了为何管理员账户(Administrators)默认无法修改由TrustedInstaller保护的系统文件。文章在强调安全风险的前提下,详细提供了通过图形界面和命令行两种方式,将文件或文件夹所有权从TrustedInstaller安全变更为Administrators的实操步骤,并给出了关键的风险预警与权限恢复方法。

weixin_29305313的博客 549

Netty 学习笔记

黑马程序员Netty全套教程 Channel 是读写数据的双向通道,Buffer是内存缓冲区,暂存数据。常见的 Channel 和 Buffer 见讲义。 ByteBuffer(包括MappedByteBuffer、DirectByteBuffer、HeapByteBuffer)最常用。多线程设计:多个客户端对应多个socket,就会启动多个线程。每个线程对应一个socket连接 缺点:内存占用高、线程上下文切换成本高、只适合连接数少的场景 线程池版设计,缺点:阻塞模式下,线程仅能处理一个 socket

cutlery1137的博客 784

MiniMax H3本地部署与ComfyUI集成实战:从环境配置到提示词优化

文本到视频生成是AI内容创作领域的关键技术,它基于扩散模型等深度学习原理,将自然语言描述转化为连贯的动态视觉序列。这项技术的核心价值在于大幅降低了视频制作的门槛,为短视频创作、概念可视化、教育内容生成等场景提供了高效工具。在实际工程实践中,成功部署和运行此类模型,如近期备受关注的MiniMax H3,需要精准处理环境配置、显存优化和提示词工程等环节。其中,解决“CUDA error: no kernel image is available”等版本兼容性问题,以及针对“8G显存”等有限资源进行参数调优,是确

weixin_33674976的博客 479

Netty入门(快速了解以及使用netty)

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位 以下的框架都使用了 Netty,因为它们有网络通信需求! Cassandra - nosql 数据库 Spark - 大数据分布式计算框架 Hadoop - 大数据分布式存储框架 RocketMQ - ali 开源的消息队列 ElasticSearch - 搜索引擎 gRPC

lonelykkk的博客 8629

Blender入门教程-3D视图界面介绍

3D视图用于与3D场景交互,可用于各种目的,例如建模、动画、纹理绘制等。在关闭 启动画面 后,启动场景会显示在3D视口中(如果没有加载其他blend文件)。01 标题栏标题栏包含了基于当前 模式 的各种菜单和控制。

weixin_52345129的博客 2291

如何在win11中用双硬盘或移动硬盘装Ubuntu 20.04 双系统

win11 安装双系统

qq_42817360的博客 5142

Netty学习笔记-Netty入门

EventLoopGroup 翻译:事件循环组,channel一般会调用EventLoopGroup的register的方法来绑定其中一个EventLoop,后续这个channel的io事件都由这个EventLoop 来处理(保证了io事件处理时的线程安全)负责根据一定的策略选择下一个可用的EventExecutor,通常是一个NioEventLoop。底层实现是两个不同的。的执行器,里面有run方法处理channel上源源不断的io事件。next()方法的实现逻辑主要是通过对内部维护的。

Ninomi_的博客 1310

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

weixin_42412049的博客 1016

Netty快速入门

Netty快速入门

Zhangsama1的博客 8989

SAP FI 会计科目表(COA)可直接套用配置模板

摘要:本文提供了SAP S/4HANA环境下可直接套用的会计科目表(COA)配置模板,包含科目编码规则、号段规划、科目组设置等核心内容。模板采用10位数字编码,按资产(1000)、负债(2000)、权益(3000)、成本(4000)、收入(5000)、费用(6000)六大类划分号段,并预设科目组控制字段状态。适用于集团/单一公司、国内/跨国企业场景,支持多表架构映射,配置完成后可通过事务码SAKO验证科目清单。模板遵循"前4位固定一级科目"原则,企业可根据行业特性调整明细科目。

金牌架构师 268

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Netty入门 -- 什么是Netty?

通俗易懂,一文让你搞懂Netty~

wanghuichen的博客 2331

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Netty入门

【零拷贝】的体现之一,对原始 ByteBuf 进行切片成多个 ByteBuf,切片后的 ByteBuf 并没有发生内存复制,还是使用原始 ByteBuf 的内存,切片后的 ByteBuf 维护独立的 read,write 指针。netty 中的 Future 与 jdk 中的 Future 同名,但是是两个接口,netty 的 Future 继承自 jdk 的 Future,而 Promise 又对 netty Future 进行了扩展。connect 方法是异步的,意味着不等连接建立,方法执行就返回了。

我的博客 1690

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

超详细Netty入门

官方的介绍:Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。

2301_76406247的博客 3851

Netty学习——Netty入门

二. Netty 入门 1. 概述 1.1 Netty 是什么? Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。 这里的异步是指Netty采用了

maruofan666的博客 1985

Netty入门教程——认识Netty

我们知道,Java的内存有堆内存、栈内存和字符串常量池等等,其中堆内存是占用内存空间最大的一块,也是Java对象存放的地方,一般我们的数据如果需要从IO读取到堆内存,中间需要经过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达他的的终点,如果数据量大,就会造成不必要的资源浪费。NIO和BIO的区别主要是在第一步。多路复用IO,他的两个步骤处理是分开的,也就是说,一个连接可能他的数据接收是线程a完成的,数据处理是线程b完成的,他比BIO能处理更多请求。原因就是图二中出现的。

lonelykkk的博客 1439

初识netty-netty快速入门

WebSocket 是一种在客户端和服务器之间建立持久连接的协议,允许双向、全双工的通信,避免了传统 HTTP 请求响应模式的高开销。WebSocket 协议通过握手建立连接,在连接建立后,可以持续发送和接收数据,适合实时应用,如聊天、在线游戏、股票行情等。@Overridelogger.info("心跳超时");@Slf4j@Component/*** 用于处理每个传入的消息。

lonelykkk的博客 4566

Netty框架学习笔记

主要讲述netty框架的学习笔记

weixin_47257473的博客 1058
上一篇: Netty入门学习笔记(二)
下一篇: Netty实战应用学习笔记-中级拓展篇(一)
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值