Netty5入门学习笔记001

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

服务器端:

TimeServer 时间服务器 服务端接收客户端的连接请求和查询当前时间的指令,判断指令正确后响应返回当前服务器的校准时间。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package  c1;
 
import  io.netty.bootstrap.ServerBootstrap;
import  io.netty.channel.ChannelFuture;
import  io.netty.channel.ChannelInitializer;
import  io.netty.channel.ChannelOption;
import  io.netty.channel.EventLoopGroup;
import  io.netty.channel.nio.NioEventLoopGroup;
import  io.netty.channel.socket.SocketChannel;
import  io.netty.channel.socket.nio.NioServerSocketChannel;
 
/**
  * server 有粘包问题
  * @author xwalker
  */
public  class  TimeServer {
     public  void  bind( int  port)  throws  Exception {
         // 服务器线程组 用于网络事件的处理 一个用于服务器接收客户端的连接
         // 另一个线程组用于处理SocketChannel的网络读写
         EventLoopGroup bossGroup =  new  NioEventLoopGroup();
         EventLoopGroup workerGroup =  new  NioEventLoopGroup();
         try  {
             // NIO服务器端的辅助启动类 降低服务器开发难度
             ServerBootstrap serverBootstrap =  new  ServerBootstrap();
             serverBootstrap.group(bossGroup, workerGroup)
                     .channel(NioServerSocketChannel. class ) // 类似NIO中serverSocketChannel
                     .option(ChannelOption.SO_BACKLOG,  1024 ) // 配置TCP参数
                     .childHandler( new  ChildChannelHandler()); // 最后绑定I/O事件的处理类
                                                                 // 处理网络IO事件
 
             // 服务器启动后 绑定监听端口 同步等待成功 主要用于异步操作的通知回调 回调处理用的ChildChannelHandler
             ChannelFuture f = serverBootstrap.bind(port).sync();
             System.out.println( "timeServer启动" );
             // 等待服务端监听端口关闭
             f.channel().closeFuture().sync();
 
         }  finally  {
             // 优雅退出 释放线程池资源
             bossGroup.shutdownGracefully();
             workerGroup.shutdownGracefully();
             System.out.println( "服务器优雅的释放了线程资源..." );
         }
 
     }
 
     /**
      * 网络事件处理器
      */
     private  class  ChildChannelHandler  extends  ChannelInitializer<SocketChannel> {
         @Override
         protected  void  initChannel(SocketChannel ch)  throws  Exception {
             ch.pipeline().addLast( new  TimeServerHandler());
         }
 
     }
 
     public  static  void  main(String[] args)  throws  Exception {
         int  port =  8000 ;
         new  TimeServer().bind(port);
     }
 
}

TimerServer接收到客户端的连接和读写请求后交给处理器handler进行事件的响应处理,服务器定义两组线程组,一组用来处理客户端连接,一组用来处理网络IO事件(SocketChannel)的响应,NioEventLoopGroup是Netty提供的NIO线程组,实际上就是Java NIO中的Reactor线程组。

ServerBootstrap是Netty提供的用于NIO服务端辅助启动类,降低了NIO服务端的开发复杂度。

ServerBootstrap需要绑定服务器网络IO事件的处理类ChildChannelHandler ,用于实际处理具体的IO事件,例如记录日志,对消息编解码等。

TimeServerHandler需要继承Netty提供的适配器ChannelhandlerAdapter重写channelRead等方法完成消息的读写。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package  c1;
 
import  io.netty.buffer.ByteBuf;
import  io.netty.buffer.Unpooled;
import  io.netty.channel.ChannelHandlerAdapter;
import  io.netty.channel.ChannelHandlerContext;
 
import  java.util.Date;
/**
  * server端网络IO事件处理
  * @author xwalker
  *
  */
public  class  TimeServerHandler  extends  ChannelHandlerAdapter {
     @Override
     public  void  channelRead(ChannelHandlerContext ctx, Object msg)
             throws  Exception {
         System.out.println( "服务器读取到客户端请求..." );
         ByteBuf buf=(ByteBuf) msg;
         byte [] req= new  byte [buf.readableBytes()];
         buf.readBytes(req);
         String body= new  String(req, "UTF-8" );
         System.out.println( "the time server receive order:" +body);
         String curentTime= "QUERY TIME ORDER" .equalsIgnoreCase(body)? new  Date(System.currentTimeMillis()).toString(): "BAD ORDER" ;
         ByteBuf resp=Unpooled.copiedBuffer(curentTime.getBytes());
         ctx.write(resp);
         System.out.println( "服务器做出了响应" );
     }
     
     @Override
     public  void  channelReadComplete(ChannelHandlerContext ctx)  throws  Exception {
         ctx.flush();
         System.out.println( "服务器readComplete 响应完成" );
     }
     
     @Override
     public  void  exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
             throws  Exception {
         ctx.close();
         System.out.println( "服务器异常退出" +cause.getMessage());
     }
}

服务器通过handler接收和处理消息请求,channelRead中的msg就是客户端请求的消息,通过解码获取具体信息后根据消息格式和定义完成后续的响应。

ByteBuf是netty封装和扩展的java NIO中的ByteBuffer类,功能更完善。通过ByteBuf接收和解码msg 转成String类型 然后判断命令是都准确,根据结果做出响应。


客户端:

客户端的处理比较简单,启动客户端,链接服务器成功后发送时间查询的指令,等待服务器响应。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package  c1;
 
import  io.netty.bootstrap.Bootstrap;
import  io.netty.channel.ChannelFuture;
import  io.netty.channel.ChannelInitializer;
import  io.netty.channel.ChannelOption;
import  io.netty.channel.EventLoopGroup;
import  io.netty.channel.nio.NioEventLoopGroup;
import  io.netty.channel.socket.SocketChannel;
import  io.netty.channel.socket.nio.NioSocketChannel;
/**
  * client 存在TCP粘包问题
  * @author xwlaker
  *
  */
public  class  TimeClient {
     /**
      * 连接服务器
      * @param port
      * @param host
      * @throws Exception
      */
     public  void  connect( int  port, String host)  throws  Exception {
         //配置客户端NIO线程组
         EventLoopGroup group =  new  NioEventLoopGroup();
         try  {
             //客户端辅助启动类 对客户端配置
             Bootstrap b =  new  Bootstrap();
             b.group(group).channel(NioSocketChannel. class )
                     .option(ChannelOption.TCP_NODELAY,  true )
                     .handler( new  ChannelInitializer<SocketChannel>() {
                         @Override
                         protected  void  initChannel(SocketChannel ch)
                                 throws  Exception {
                             ch.pipeline().addLast( new  TimeClientHandler());
                         }
                     });
             //异步链接服务器 同步等待链接成功
             ChannelFuture f = b.connect(host, port).sync();
             //等待链接关闭
             f.channel().closeFuture().sync();
 
         }  finally  {
             group.shutdownGracefully();
             System.out.println( "客户端优雅的释放了线程资源..." );
         }
 
     }
 
     public  static  void  main(String[] args)  throws  Exception {
         new  TimeClient().connect( 8000 ,  "127.0.0.1" );
     }
 
}

客户端定义一组线程组用于处理与服务器的网络IO事件。通过客户端辅助启动类 Bootstrap来配置线程组、TCP参数以及IO事件处理的Handler。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package  c1;
 
import  io.netty.buffer.ByteBuf;
import  io.netty.buffer.Unpooled;
import  io.netty.channel.ChannelHandlerAdapter;
import  io.netty.channel.ChannelHandlerContext;
 
import  java.util.logging.Logger;
/**
  * Client 网络IO事件处理
  * @author xwalker
  *
  */
public  class  TimeClientHandler  extends  ChannelHandlerAdapter {
     private  static  final  Logger logger=Logger.getLogger(TimeClientHandler. class .getName());
     private   ByteBuf firstMessage;
     public  TimeClientHandler(){
         byte [] req = "QUERY TIME ORDER" .getBytes();
         firstMessage=Unpooled.buffer(req.length);
         firstMessage.writeBytes(req);
     }
     @Override
     public  void  channelActive(ChannelHandlerContext ctx)  throws  Exception {
         ctx.writeAndFlush(firstMessage);
         System.out.println( "客户端active" );
     }
     
     @Override
     public  void  channelRead(ChannelHandlerContext ctx, Object msg)
             throws  Exception {
         System.out.println( "客户端收到服务器响应数据" );
         ByteBuf buf=(ByteBuf) msg;
         byte [] req= new  byte [buf.readableBytes()];
         buf.readBytes(req);
         String body= new  String(req, "UTF-8" );
         System.out.println( "Now is:" +body);
         
     }
     
     @Override
     public  void  channelReadComplete(ChannelHandlerContext ctx)  throws  Exception {
         ctx.flush();
         System.out.println( "客户端收到服务器响应数据处理完成" );
     }
     
     @Override
     public  void  exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
             throws  Exception {
         logger.warning( "Unexpected exception from downstream:" +cause.getMessage());
         ctx.close();
         System.out.println( "客户端异常退出" );
     }
}

TimeClienthandler继承Netty提供的Handler适配器,重写channelActive和channelRead方法 前者通道打开active状态时 发送查询指令,后者接收服务器响应的消息并解码输出。


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

相关推荐

netty快速入门教程5集 共12集

netty快速入门教程5集 共12集 netty快速入门教程5集 共12集 目前看是全网最有价值的一份,其他的要么要密码,要么要钱。这个下载即可播放。

Netty5入门(1)

一、     搭建开发环境 本教程使用的开发环境为MacOSX 10.10+JDK1.8+Eclipse Java EE IDE4.4.1+Maven3.2.5。以下是开发环境的搭建过程。1. 安装JDK 1.8本教程使用的JDK版本为JDK1.8。你可以在http://java.com下载到这个最新的JDK。JDK的安装配置就不用多说了,你明白的。2. 安装Eclipse Java EE本教程使

kmyhy的专栏 2万+

Netty5入门3个简单例子

Netty5入门3个简单例子,让你快速入门,一个服务端、客户端,以及一个参考的网站地址;Netty5是个优秀稳定高效的java服务器框架,特别适用于java游戏服务器快速开发!

架构师入门笔记十 Netty5快速入门

在了解IO,NIO,AIO知识后,学习Netty5便会轻松很多,本章节主要介绍Netty是如何接收,反馈数据和拆包粘包的问题。1 Netty基础知识1.1 Netty作用Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠性 的网络服务器和客户端程序。Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议。Netty简化了网络程序的开发过程...

M_Jack的博客 517

NIO+Netty5视频教程与Netty源码剖析视频教程

视频分两部分:第一部分:深入浅出Netty源码剖析;第二部分:NIO+Netty5各种RPC架构实战演练(非加密)

figma MCP + cursor如何将设计稿生成前端页面

Figma MCP配置与代码生成指南 本文详细介绍了如何在Cursor中配置Figma MCP(多上下文处理器)的完整流程:从获取Figma API密钥、设置MCP服务器配置,到添加代码生成规则。关键步骤包括生成Figm a个人访问令牌、配置cursor settings文件、启用MCP服务,以及设置代码规则(包含TypeScript/Vue技术栈规范、BEM命名规则等)。最后提供了将Figma设计稿转化为Vue页面的prompt模板,涵盖文件结构、图片处理、样式规范等具体要求,确保生成代码与设计稿高度一致

weixin_45644355的博客 2907

Netty5-入门实例-TCP服务

Netty 模型理论

weixin_47409774的博客 798

5g LDPC编译码-LDPC编码

本文摘要:LDPC编码是5G业务信道的核心编码技术,属于线性分组码。5G中LDPC编码分为两种基图类型(BG1和BG2),通过码块分割、CRC处理等步骤实现。编码过程主要涉及校验矩阵生成和校验位计算,其中校验矩阵采用稀疏矩阵结构。文中详细介绍了5G LDPC编码的具体实现流程,包括码块分割规则、校验位生成方法,以及两种基图(BG1和BG2)在矩阵结构和参数设置上的差异,重点阐述了通过模块化方法求解校验比特位的技术路径。

weixin_38270585的博客 1365

Netty5 入门HelloWorld

之前,查找缓冲区泄漏是很困难的,并且泄漏的警告信息也不是很有帮助。的后续版本,因此在架构上进行了一些重大调整,增加了许多新的功能和特性,使得其复杂性相较于。方法返回专门类型的参数,因此你不必在转换他们的返回值。这可以简化你的测试用例代码。的设计方式相似,因此它们之间的差异并不是特别大。中如果存在一个以上的属性容易是多余的。都有其自己的存储用户定义属性的容器。的主要区别在于它们的版本更新以及一些新特性的添加。对于在容器环境下运行的应用是不友好的,现在不是了。的方式,使用该特性需要指定一个用户自定义的。

程序猿进阶 1910

ShardingSphere分库分表教程,java后端开发面试题

???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 目录 一、分库分表 二、分库分表的方式 1、垂直分表 2、垂直分库 3、水平分表 4、水平分库 三、分库分表带来的问题 1、学习成本问题 2、事务问题 3、跨节点join问题 4、跨节点的count、order by、group by以及聚合函数问题 5、数据迁移、容量规划、扩

m0_64205716的博客 3015

NVIDIA NCCL 安装和测试实战教程

ibrary)是用于深度学习应用的高性能通信库,可加速多GPU通信和同步。它能够在多个GPU之间进行高效的数据传输和集体操作,显著提高了分布式GPU系统上深度学习训练和推理的性能。NVIDIA NCCL是加速多GPU系统上深度学习应用的必不可少的工具。其高效的通信原语和集体操作显著提高了分布式训练和推理的性能,使其成为现代深度学习基础架构的关键组成部分。

weixin_39818775的博客 4428

Netty学习笔记

non-blocking io,jdk1.4后新增。

qq_42292537的博客 329

深度伪造检测实战:轻量级频域特征 pipeline 部署指南

深度伪造检测(deepfake detection)是多媒体内容安全的核心技术,其本质是通过建模生成式篡改在像素与频域留下的微弱异常痕迹。传统端到端大模型虽在标准数据集上表现优异,却因训练域与真实场景失配、计算开销高、缺乏可解释性而难以落地。本文聚焦于工程可复现的实践路径,提出‘人脸定位→频域伪造特征提取(Xception-FCN + Frequency-Aware Masking)→轻量分类决策’三段式解耦架构,兼顾精度、延迟与可解释性。该方案已在边缘设备(Jetson Orin NX)实现单帧<48ms

weixin_33437929的博客 306

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

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

lonelykkk的博客 8626

智元机器人开源具身仿真框架 Genie Sim 入门教程

GenieSim是AgiBot推出的具身智能仿真框架,提供完整闭环开发管道,包括轨迹生成、模型训练和基准测试。框架支持Docker容器化部署,要求Ubuntu 22.04和NVIDIA硬件环境。主要功能涵盖: 支持12种基准测试任务 提供ADER评估框架 集成UniVLA/RDT等基线模型 支持PICO/键盘遥操作 具备轨迹记录回放功能 提供完整API控制接口 开发者可通过Hugging Face获取场景资产,使用标准化ROS主题与仿真环境交互。框架特别优化了碰撞检测和抓取物理模拟,适用于从简单抓取到复杂操

2506_90492529的博客 2539

解锁RK3588多屏异显:MIPI+HDMI+EDP混合输出全攻略

本文详细介绍了RK3588处理器在MIPI+HDMI+EDP混合输出配置中的技术实现与应用。作为一款高性能处理器,RK3588凭借其强大的图形处理能力,支持多屏异显功能,可满足智能安防、工业控制等领域的多屏显示需求。文章从硬件连接、设备树配置、内核驱动设置到显示参数调整,系统阐述了配置流程,并针对信号不稳定、显示模式不匹配等常见问题提供了解决方案。通过智能安防监控案例,展示了该技术在提高监控效率方面的实际应用价值。随着技术进步,RK3588多屏异显技术将在更多领域发挥重要作用,为开发者提供灵活多样的显示方案

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2431

Netty学习笔记-Netty入门

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

Ninomi_的博客 1309

详解Pytorch求导

本文主要详解Pytorch求导,希望能对学习Pytorch的同学有所帮助。 文章目录 1. pytorch求导问题 2. pytorch三大类求导代码示例 2.1 标量求导 2.2 向量求导&矩阵求导

weixin_43178406的博客 3073

Netty入门

同时也会执行一些。

m0_74229735的博客 1552

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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的博客 1984

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Netty入门 -- 什么是Netty?

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

wanghuichen的博客 2329

蓝牙模块HM-10手册

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

Netty快速入门

Netty快速入门

Zhangsama1的博客 8987
上一篇: linux下mysql中文输出乱码
下一篇: Netty5入门学习笔记002-TCP粘包/拆包问题的解决之道(上)
樊鹏飞
博客等级 码龄15年 6粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值