Netty学习和代码模板详解

Netty 详细讲解,附服务端,客户端代码例子 的作用是管理事件循环组,它们负责处理不同类型的事件,如接受传入连接、读取/写入数据等。在这里,我们创建了两个bossGroup和。bossGroup用于接受传入的连接请求,而则用于实际处理连接的流量。是 Netty 用于启动服务器的帮助类。通过group()方法将两个绑定到服务器上。channel()方法指定了服务器使用的通道类型。在这里,我们选择了,这意味着我们将使用基于 NIO 的 Socket 通道。方法设置了一个,当一个新的连接被接受时,这个初始化器将会被调用。 阅读详情

在学习Netty的相关知识时,发现需要记录一下,netty就是用于创建高性能网络应用程序的高级框架,是非阻塞的,代码的基本框架就是netty客户端,客户端应用,netty服务器端,服务器端应用,其主要元素包含EventLoopGroup,Channel,ChannelFuture,ChannelFuture,ChannelHandler,ChannelPipeline,Bootstrap(ServerBootstrap),ChannelInboundHandler(ChannelOutboundHandler),ByteBuf这几个主要的东西,代码编程主要就是填充这些东西;

一.代码编写流程

客户端和服务器短的流程是一样的,因此一次性罗列了:

netty客户端/netty服务器端,代码流程:

  1. 创建客户端类/服务器端(c/s)类
  2. 创造c/s构造方法,主要传入参数为地址和端口
  3. 创建c/s的引导器Bootstrap(ServerBootstrap)
  4. 创建c/s的生命周期组EventLoopGroup为NioEventLoopGroup()
  5. 配置装载引导器,把生命周期组EventLoopGroup装载到引导器,配置地址和端口,配置通道类型,配置操作句柄Handler
  6. 填写Handler,初始化装载channel,并对channel配置一个或多个pipeline,即ChannelInboundHandler(ChannelOutboundHandler),相当于注册相应的逻辑程序(handler)
  7. 创建ChannelFuture启动//引导启动连接绑定(connect/bind)阻塞
  8. 阻塞关闭关闭占位符ChannelFuture
  9. 关闭整个线程组

客户端应用/服务器端应用代码编写流程

  1. 编写操作继承ChannelInboundHandler(ChannelOutboundHandler)
  2. 客户端重写channelActive,向服务端发送数据,服务端重写channelRead读取客户端的数据并向客户端发送数据
  3. 客户端channelRead0读取服务端的数据
  4. 重写异常处理

到此编写流程就写完了,在编程的过程中传送的可以是字符串,对象,其流程是一样的netty传输的过程是通过ByteBuf,所以不管是字符串还是对象都需要序列化和反序列化,其基本框架都是一样的,只是喊打了让不一样;

二.实力代码详解

1.netty客户端

SendClinet.java

package bigdata.nionetty.sendstring;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;

import java.net.InetSocketAddress;
import java.nio.channels.SocketChannel;

import bigdata.studynio.NioClientWork;

public class SendClinet {
	
	
	private final String host;
	private final int port;
	
	//构造客户端方法
	public SendClinet(String host,int port){
		this.host=host;
		this.port=port;		
	}
	//客户端启动
	public void start() throws InterruptedException {
		//创建生命周期组,EventLoopGroup包含一个或多个EventLoop,而EventLoop在一个生命周期内只能绑定一个Thread
		//每一个EventLoop的I/O事件都是由这个Thread处理,一个channel在生命周期内只能对应一个EventLoop,
		//但一个EventLoop可以被分给一个或多个channel,因此channel和thread是对应的
		EventLoopGroup group = null;
		try {
			Bootstrap bootstrap = new Bootstrap();//创建一个引导启动类
			group = new NioEventLoopGroup();
			bootstrap.group(group)//把事件生命周期组EventLoopGroup注册引导启动类中去启动
				.channel(NioSocketChannel.class)//注册channel类型为NioSocketChannel,这个类型还有NioSctpChannel,NioDatagramChannel,LocalServerChannel,EmbeddedChannel
				.remoteAddress(new InetSocketAddress(host, port))//注册连接的服务器地址端口
				//注册事件操作句柄,使用childHandler时候不可以,所以只能用handler代替了
				.handler(new ChannelInitializer<io.netty.channel.socket.SocketChannel>() {
					@Override
					protected void initChannel(//初始化通道
							io.netty.channel.socket.SocketChannel ch)
							throws Exception {
						//一个SocketChannel可以添加多个ChannelHandler,可以多加addLast,
						//这个ChannelHandler,有两种In和Out即ChannelInboundHandler,ChannelOutboundHandler
						//pipeline 在处理In和Out顺序是,in是从头部开始,out是尾部开始,例如 in1,out1,out2,in2,运行结果是in1->in2,out2->out1
                                                //ChannelInboundHandler之间的传递,通过调用 ctx.fireChannelRead(msg) 实现;调用ctx.write(msg) 将传递到ChannelOutboundHandler,
                                                //ctx.write()方法执行后,需要调用flush()方法才能令它立即执行,
                                                //pipeline中outhandler不能放在最后,否则不生效
						ch.pipeline().addLast((ChannelHandler) new SendClientForWork());
						
					}
				});
// 最后绑定服务器等待直到绑定完成,调用sync()方法会阻塞直到服务器完成绑定,然后服务器等待通道关闭,因为使用sync(),所以关闭操作也会被阻塞。
				ChannelFuture sync=bootstrap.connect().sync();//引导启动连接,ChannelFuture为将要执行操作的占位符
				//sync.channel().close().sync();
				sync.channel().closeFuture().sync();//关闭占位符,而不关闭整个通道,close是关闭整个客户端
			}finally {
			group.shutdownGracefully().sync();//关闭整个线程组
		}				 
	}	
	public static void main(String[] args) throws Exception {
		System.out.println("client start....");
		new SendClinet("localhost",20000).start();//指定连接服务器的地址和端口
		
	}

}

SendClientForWork.java

package bigdata.nionetty.sendstring;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

//继承ChannelInboundHandler
public class SendClientForWork extends SimpleChannelInboundHandler<ByteBuf>{

	// 客户端连接服务器后被调用,并向服务器发送数据
	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		System.out.println("客户端连接服务器,并开始发送数据。。。");
		byte[] req = "查询时间".getBytes();//查询命令设置,并序列化
		ByteBuf buffer = Unpooled.buffer(req.length);
		buffer.writeBytes(req);
		ctx.writeAndFlush(buffer);//发送数据		
	};
	// 从服务器接收到数据后调用,处理收到的数据逻辑	
	@Override
	protected void channelRead0(ChannelHandlerContext arg0, ByteBuf arg1)
			throws Exception {
		System.out.println("客户端读取服务端的数据...");
		ByteBuf msg = arg1;
		byte[] bytes=new byte[msg.readableBytes()];
		msg.readBytes(bytes);//将msg消息读取到bytes中,并反序列化收到的消息
		String string = new String(bytes,"UTF-8");
		System.out.println("读取的服务端的数据为:" + string);
		
	}
	// 当连接发生异常时被调用
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
			throws Exception {
		System.out.println("客户端异常处理。。。");
		ctx.close();//关闭上下文,释放资源
	}
	
}

2.netty服务器端

SendServer.java

package bigdata.nionetty.sendstring;

import java.nio.channels.SocketChannel;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

//构造服务端方法
public class SendServer {
	private final int port;
    public SendServer(int port) {
		this.port=port;
	}
    //服务器短启动
    private void start() throws Exception {
    	
		EventLoopGroup group = null;
		try{
		ServerBootstrap serverBootstrap = new ServerBootstrap();//创建server引导
		group = new NioEventLoopGroup();
		serverBootstrap.group(group)
			.channel(NioServerSocketChannel.class)
			.localAddress("localhost",port)
			.childHandler(new ChannelInitializer<io.netty.channel.socket.SocketChannel>() {

				@Override
				protected void initChannel(
						io.netty.channel.socket.SocketChannel ch)
						throws Exception {
					ch.pipeline().addFirst((ChannelHandler) new SendServerForWork());
					
				}
			});
		ChannelFuture sync = serverBootstrap.bind().sync();
		System.out.println("开始监听,地址端口为:" + sync.channel());
		sync.channel().closeFuture().sync();
		}finally{
		group.shutdownGracefully().sync();
		}
	}
    
    public static void main(String[] args) throws Exception {
    	System.out.println("server start.......");
		new SendServer(20000).start();
	}

}

SendServerForWork.java

package bigdata.nionetty.sendstring;

import java.util.Date;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

public class SendServerForWork extends ChannelInboundHandlerAdapter{
	
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg)
			throws Exception {
		//读取数据
		System.out.println("服务器读取数据。。");
		ByteBuf buf = (ByteBuf)msg;
		byte[] bytes = new byte[buf.readableBytes()];
		buf.readBytes(bytes);
		String string = new String(bytes, "UTF-8");
		System.out.println("读取客户端的数据为:"+ string);
		//向客户端发送数据
		System.out.println("服务器向客户端发送数据...");
		String currenttime = new Date(System.currentTimeMillis()).toString();
		ByteBuf copiedBuffer = Unpooled.copiedBuffer(currenttime.getBytes());
		ctx.write(copiedBuffer);
		
	}
	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		System.out.println("服务器读写数据完毕。。。");
		ctx.flush();
	}
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
			throws Exception {
		System.out.println("服务器异常处理。。。");
		ctx.close();
	}
}

三.运行结果

开启服务器端

开启客户端

开启客户端后服务器的log

 

吃透Netty源码系列四十五之HttpObjectAggregator详解 吃透Netty源码系列四十五之HttpObjectAggregator详解聚合消息先介绍一下一些属性结构MessageAggregatoracceptInboundMessage判断类型decode真正的聚合HttpObjectAggregator的isStartMessageHttpObjectAggregator的isLastContentMessageHttpObjectAggregator... 阅读详情

相关推荐

halcon 查找圆形

先找到大概位置进行拟合,然后再以拟合出的位置作为测量的大概位置进行找圆;

qq_59062726的博客 735

Netty——简单的入门代码示例

一个非常简单的Netty入门示例,简简单单搞定服务端和客户端的通信

共勉 1861

数据可视化—power bi 基础操作汇总

数据来源: https://pan.baidu.com/s/1U_Y7rKfhnSKbLmh4FcUD_Q 提取码: yq5v 目录 基本功能与视图 编辑与查询—修改column案例 建立关联性 新增column与DAX完成总价运算 习题练习1:建立可视化图表 产品销售统计图 column拖曳可视化 1.基本功能与视图 ①基础操作界面 ②获取数据—以打开excel为例 ③数据文件基本视图 可视化形式:柱状图、数据、关联性 2.编辑与查询—修改column ①编辑与查询—数据处理界面 .

weixin_52730784的博客 2683

Netty-客户端及服务端代码模板

一、服务端代码模板 public class NettyServer { public static void main(String[] args) throws InterruptedException { //server启动器 ServerBootstrap serverBootstrap = new ServerBootstrap(); //boss线程组,监听端口链接 NioEve

m0_37914588的博客 1586

保姆级教程:用NovAtel Inertial Explorer 8.7搞定GNSS/INS紧组合后处理(附避坑指南)

本文提供NovAtel Inertial Explorer 8.7的GNSS/INS紧组合后处理全流程教程,涵盖环境准备、数据转换、基站坐标解算及紧组合处理等关键步骤。特别针对零基础用户,分享实用技巧和常见陷阱,帮助高效完成高精度组合导航数据处理,适用于测绘、自动驾驶等领域。

weixin_42614269的博客 283

GROMACS+PLUMED联合安装避坑指南:为什么你的plumed patch总是失败?

本文深入解析GROMACS与PLUMED联合安装中补丁失败的常见原因,并提供详细的避坑指南。针对版本兼容性、环境配置和编译选项等关键问题,给出从源码选择、环境搭建到手动合并补丁的完整解决方案,帮助用户成功整合这两个强大的分子动力学工具,实现增强采样模拟。

weixin_29302047的博客 289

Netty入门,开发一个简单的服务器端和客户端,不玩虚的直接上代码!(已完善客户端代码!粘贴启动即可!)

现在,用netty开发一个简单的服务器端和客户端,实现客户端发送消息给服务端,服务端收到之后反馈给客户端。Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。项目,名字自己随便取就行,构建好了之后再。先看看官网这段“英格力士”创建自定义handler类。......

mltaozi的博客 1215

uniapp [安卓苹果App端] - 实现获取手机日历读写权限+调用本机日历数据及操作功能+日历中插入事项事件提醒,检测权限手机日历权限是否开启并引导用户同意授权,uniApp app端开启日历授权

uni-app,权限,手机日历权限,安卓Android,苹果ios,uniapp安卓android获取本机日历读写权限使用,uni-app获取日历权限并实现插入事项事件功能 uniapp苹果IOS系统不支持怎么办,判断权限,权限被拒绝了怎么办,获取日历权限报错,读取日历数据农历阴历并操作插入移除,给用户手机日历中放入一条提示,UniApp调用日历进行读写,打包上架后如何获取,安卓ios权限检测,安卓和ios权限获取,uniapp的APP端日历读写权限与使用示例代码,如何开启日历权限,日历的新增事项和删除,判

🏆 前端领域优质创作者 1万+

netty4核心源码分析第三篇一netty模板代码及常见配置

文章目录模板代码eventLoop创建原理图Bootstrap绑定原理图配置总结 模板代码 创建线程组 创建引导类ServerBootstrap 一系列配置[包括option和childOption],[childHandler] 通过ServerBootstrap执行bind启动netty服务 核心代码 作用 EventLoopGroup workerGroup = new NioEventLoopGroup() 创建多个reactor线程 ServerBootstrap.bind

小麒麟的博客 815

【异常】OpenClaw 项目 `fetch failed` 报错问题排查与解决方案Response interrupted: TypeError: fetch failed

针对无超时控制、异常兜底缺失导致的请求中断,封装标准化的安全请求工具,一次性解决超时控制、异常捕获、日志埋点三大问题,全项目替换原生。:将项目运行的 Node.js 版本升级至 18.x 及以上 LTS 版本,使用 Node.js 内置的稳定版。实现的网络请求环节,包括但不限于:第三方开放接口调用、内部服务接口通信、跨域资源请求、外部配置拉取等场景。:针对无法升级 Node.js 版本的存量环境,通过社区稳定兼容包替换原生。类型异常,直接造成业务请求响应中断。第二步:业务代码改造,替换原生。

奶爸的编程之路,也就一周冷个三天 368

18|AI 辅助精准测试:让平台会解释、会总结、会推荐

本文介绍 AI 在精准测试平台中的落地方式,包括变更摘要、风险解释、补测建议和报告总结。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。从报告中提取变更文件、未覆盖行、推荐用例。拼成结构化 JSON。让 AI 生成 200 字质量摘要。把摘要展示在报告顶部。读完本文后,可以复制下面的 Prompt,让 AI 生成一个报告总结练习。你是一名 AI 应用开发专家和测试架构师。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 55

深入netty21-netty中的设计模式-模板方法、迭代器、适配器详解

定义了模板方法和基本方法(包括抽象方法和具体方法)。

m0_63833709的博客 2904

012、乘累加单元(MAC):NPU中最基本的计算单元

本文深入剖析了神经网络处理器(NPU)中的核心计算单元——乘累加单元(MAC)。作者通过实际调试案例揭示了MAC单元设计中的关键问题:定点数格式对齐、累加器位宽陷阱、流水线优化和多MAC同步方案。重点讨论了INT8量化中的边界条件处理、偏置项截断风险以及零值检测等实战经验,并提供了三点实用建议:建立精确的C模型、参考RISC-V P扩展指令集、仔细审查芯片规格书。文章强调硬件加速的实际瓶颈往往在于数据搬运而非计算单元本身,为NPU开发者提供了宝贵的工程实践参考。

m0_50546716的博客 299

Netty 入门学习

netty入门学习笔记; EventLoop,Channel,ByteBuf;

weixin_53142722的博客 4698

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Netty 实战

请思考,因为 pipeline 的存在,一般需要将 ByteBuf 传递给下一个 ChannelHandler,如果在 finally 中 release 了,就失去了传递性(当然,如果在这个 ChannelHandler 内这个 ByteBuf 已完成了它的使命,那么便无须再传递)负载,但是却造成了延时,而该参数的作用就是禁止使用Nagle算法,使用于小数据即时传输,于TCP_NODELAY相对应的是TCP_CORK,该选项是需要等到发送的数据量最大的时候,一次性发送数据,适用于文件传输。

prcyang的专栏 1226

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

模板方法模式在Netty以及MyBatis源码中的应用

行为型模式 1、模板方法模式 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

蒙奇D灬小武的博客 565

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Spring环境下使用Netty写Socket和Http详解

Spring和Netty整合详解 官方主页 Spring Netty 概述 Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 相比JDK原生NIO,Netty提供了相对十分简单易用的API,非常适合网络编程。Netty是完全基于NIO实现的,所以Netty是异步的...

feiyangtianyao的专栏 2900

netty的代码框架

Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UD...

weixin_43646150的博客 174

Netty详解之二:Netty概述

总体上,Netty是一个高性能网络编程框架,不仅仅是对java socket接口的封装,它的功能可概括如下: 事件驱动的异步编程模型(reactor模型) 灵活的线程池管理; 支持常见的传输层协议和应用层协议; 屏蔽了底层bug(比如NIO Epoll Bug),更加稳定高效。 总之,netty性能较好,功能较全,文档相对完善,基本成为了java领域socket编程的首选工具。 Reactor模型 很多文章将Recactor模型和IO模型混在一起介绍,是不合适的;因为这二者不在同一个层次,reactor

longhuihu的专栏 782

Netty 分享之动态生成重复性的代码

我在调试Netty提供的example时,IDEA build完后报了一些类不存在的错误,比如其中有一个报缺少LongObjectHashMap的错: img1.png 到common模块下发现io.netty.util包下确实没有collection包: img2.png 缺少了代码,为了让程序能成功运行起来,肯定要把这缺少的代码找回来啊。首先我用git pull origin ...

放逐的菜鸟的博客 1313

(一)Netty是什么和Netty的基本原理架构

Netty是基于CS架构的一种模式,分为Client端和Server端 (1)先从Server端开始,先看一下Netty服务端的运行原理图: 首先你得知道下面的几个主要的角色: serverBootstrap NioEventLoopGroup (这个是专门负责接收client端的请求的) NioEventLoopGroup (这个是专门负责干活的) NioServerSocketChanne...

王伟的博客 1536

Netty Bootstrap/ServerBootstrap 详解及详细源码展示

/ 配置 Bootstrap@Override});// 连接服务器Netty 的Bootstrap和通过链式配置、模板方法模式、反射通道创建等核心技术,极大简化了网络应用的启动流程。约定优于配置:通过等扩展点暴露关键配置,避免冗余 API。零侵入式设计:用户仅需关注业务逻辑,底层 I/O 细节完全封装。资源隔离:服务端双事件循环组模型实现 I/O 与业务逻辑解耦。深入理解其源码,不仅可掌握网络应用启动的最佳实践,更能领悟到 Netty 在 API 设计方面的哲学。

csdn_tom_168的博客 810

Netty基础学习

文章目录Channel和业务逻辑ByteBuf的优点Channel的生命周期ChannelHandler的生命周期Handler重要概念:**两个重要的ChannelHandler子接口:****ChannelPipeline**ChannelHandlerContext接口**ChannelHandler和ChannelHandlerContext的高级用法**异常处理EventLoop接口Reactor模式*角色构成:****Reactor模式的流程***ChannelPipelineNetty线程模型

qq_44266274的博客 771

Netty模板代码

服务端 package com.lagou.demo; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; /**

KongHaoYue的博客 379

【Netty】SimpleChannelInboundHandler和ChannelInboundHandlerAdapter

文章目录1. 类的关系1.1 SimpleChannelInboundHandler1.2 ChannelInboundHandlerAdapter 1. 类的关系 如下就是两个类的声明,SimpleChannelInboundHandler是继承 ChannelInboundHandlerAdapter的。也就是说SimpleChannelInboundHandler 也拥有 ChannelInboundHandlerAdapter的方法。 //ChannelInboundHandlerAdapter 类

m0_45406092的博客 3156
上一篇: Android 7.0内去掉有关USB 耳机音频输入设备的对话框和Toast方法
下一篇: C语言16进制转字符串,并从文件中查询到这个16进制字符串问题解析
葫芦娃二娃
博客等级 码龄15年 1850粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值