spring boot 集成netty,及其一些基本概念

一、基本概念
1、channel:通道,入站或者出站数据的载体
2、ChannelHandler:通道处理器,业务逻辑写在这里面,netty 5版本将入战和出站合并成了ChannelHandler
3、ChannelPipeline:通道里的管道,是一个或者多个ChannelHandler链的容器,当channel被创建时,会为该Channel自动分配一个ChannelPipeline,ChannelPipeline中可以放多个ChannelHandler。
4、ChannelHandlerContext:通道处理器上下文,代表了ChannelHandler和ChannelPipeline的关联关系,每当有ChannelHandler被添加到ChannelPipeline时就会创建一个ChannelHandlerContext。ChannelHandlerContext的主要功能是管理它所关联的ChannelHandler和在同一个ChannelPipeline中其他的ChannelHandler之间的交互。
5、ChannelHandlerAdapter:通道处理器的适配器,提供了入站和出站ChannelHandler的基本实现。
6、EventLoop与EventLoopGroup:称为事件循环,用来运行连着周期内发生的事件的。EventLoopGroup为每个新创建的Channel分配一个EventLoop。多个Channel可以共享一个EventLoop。
7、SimpleChannelInboundHandler:可以用来接收解码消息,无需手动释放资源。
8、引导:作用是创建Channel组装成可运行的程序。分为客户端引导和服务端引导。客户端引导:为客户端应用程序创建Channel当调用bind()或者connect()方法时就会创建一个Channel。服务器引导:当bind()方法被调用时会创建一个ServerChannel,当有客户端连接并且服务器端接受时,ServerChannel会创建相应的Channel进行通信。
9、ChannelInitializer:通道Channel初始化时调用。
10、入站和出站:入站是指数据从网络层流向你的应用程序,出战是指数据从应用程序流向网络层。在ChannelPipeline的流向,入站是从头到尾,出站是从尾流向头部。
11、注意:ChannelHandler的实现类,如果被标记为@Sharable,则代码该处理器可以被添加到多个ChannelPipeline中去。
二、搭建一个简单的客户端和服务端
1、安装依赖

<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>5.0.0.Alpha2</version>
</dependency>

2、客户端
2.1 新建处理器类:EchoClientHandler

@ChannelHandler.Sharable
public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {@Overridepublic void channelActive(ChannelHandlerContext ctx){ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rocks!", CharsetUtil.UTF_8));}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg){ByteBuf in = (ByteBuf) msg;System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8));}@Overrideprotected void messageReceived(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){cause.printStackTrace();ctx.close();}
}

2.2 新建客户端引导

public class EchoClient {private final String host;private final int port;public EchoClient(String host, int port) {this.host = host;this.port = port;}public void start() throws Exception {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(group).channel(NioSocketChannel.class).remoteAddress(new InetSocketAddress(host, port)).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new EchoClientHandler());}});ChannelFuture future = bootstrap.connect().sync();future.channel().closeFuture().sync();}finally {group.shutdownGracefully().sync();}}public static void main(String[] args) throws Exception {new EchoClient("127.0.0.1", 2221).start();}}

3、服务器端
3.1 新建服务器端ChannelHandler

@ChannelHandler.Sharable
//@ChannelHandler.Sharable
public class EchoServerHandler extends SimpleChannelInboundHandler {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg){ByteBuf in = (ByteBuf) msg;System.out.println("Server received: " + in.toString(CharsetUtil.UTF_8));ctx.write(in);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx){ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){cause.printStackTrace();ctx.close();}@Overrideprotected void messageReceived(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {}
}

3.2 新建服务器端引导

public class EchoServer {private final int port;public EchoServer(int port) {this.port = port;}public void start() throws Exception {final EchoServerHandler serverHandler = new EchoServerHandler();EventLoopGroup group = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(group).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress(port)).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(serverHandler);}});System.out.println("监听端口");ChannelFuture f=b.bind().sync();System.out.println("服务端关闭");f.channel().closeFuture().sync();}finally {group.shutdownGracefully().sync();}}public static void main(String[] args) throws Exception {new EchoServer(2221).start();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90243.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7月23日华为机考真题第一题100分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 bishipass.com 01. 创业投资收益优化 问题描述 K小姐刚刚大学毕业,手头有 m m m 元资金想要进行创业投资。她发现了 k k

HTML5 跨文档通信机制:postMessage API 详解与应用

postMessage 是 HTML5 规范中定义的跨文档通信&#xff08;Cross-Document Messaging&#xff09;API&#xff0c;其设计目的是解决不同源&#xff08;协议、域名、端口任一存在差异&#xff09;的窗口&#xff08;如 iframe 嵌入的文档、window.open 创建的新窗口&#xff09;…

Kafka——Kafka中的位移提交

引言&#xff1a;为什么位移提交至关重要&#xff1f;在Kafka的分布式消息系统中&#xff0c;消费者组&#xff08;Consumer Group&#xff09;通过分区分配机制实现负载均衡和容错&#xff0c;但如何准确记录每个消费者的消费进度&#xff0c;是保证消息不丢失、不重复的关键。…

java设计模式 -【装饰器模式】

装饰器模式的定义 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;允许向一个现有对象动态添加新功能&#xff0c;同时不改变其结构。它通过创建包装对象&#xff08;装饰器&#xff09;来包裹原始对象&#xff0c;并在保持原始对象方法…

手写字体生成器:一键模拟真实笔迹

软件介绍 在自媒体创作领域&#xff0c;手写体文案因其独特的艺术感而备受青睐。然而&#xff0c;真实的手写往往效率低下且效果难以保证。今天为大家推荐一款专业的手写模拟软件&#xff0c;能够一键生成逼真的手写字体效果&#xff0c;完美解决创作效率与质量的双重需求。…

【Android】用 ViewPager2 + Fragment + TabLayout 实现标签页切换

文章目录【Android】用 ViewPager2 Fragment TabLayout 实现标签页切换一、引入&#xff1a;什么是 ViewPager2 &#xff1f;二、ViewPager2 的基础使用1. 在布局文件 (activity_main.xml)中添加 ViewPager22. 制作一个 Fragment2.1 创建一个布局文件2.2 创建一个 Fragment 类…

嵌入式学习-土堆目标检测(4)-day28

Pytorch中加载自定义数据集 - VOC其中需要pip install xmltodict#voc_dataset.pyimport os import torch import xmltodict from PIL import Image from torch.utils.data import Dataset import torchvision.transforms as transformsclass VOCDataset(Dataset): def __init_…

Spring MVC上下文容器在Web容器中是如何启动的(源码深入剖析)?

文章目录一、双容器架构&#xff1a;MVC容器与根容器的关系二、启动全流程解析1. 启动流程全景图2. 初始化根容器&#xff08;Root WebApplicationContext&#xff09;2.1 Tomcat 中启动入口源码解析2.2 Spring 根上下文启动源码解析3. 初始化 MVC 容器&#xff08;DispatcherS…

【iOS】编译和链接、动静态库及dyld的简单学习

文章目录编译和链接1️⃣核心结论&#xff1a;一句话区分2️⃣编译过程&#xff1a;从源代码到目标文件&#xff08;.o&#xff09;2.1 预处理&#xff08;Preprocessing&#xff09;&#xff1a;“替换变量复制粘贴”2.2 编译&#xff08;Compilation&#xff09;&#xff1a;…

金山办公WPS项目产品总监陈智新受邀为第十四届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会珠海金山办公软件有限公司WPS项目产品总监 陈智新先生 受邀为“PMO评论”主办的2025第十四届中国PMO大会演讲嘉宾&#xff0c;演讲议题为&#xff1a;中小团队PMO的成长之路&#xff0c;敬请关注&#xff01;议题简要&#xff1a;在竞争激烈、需求多变的…

web安全 | docker复杂环境下的内网打点

本文作者&#xff1a;Track-syst1m一.前言本文涉及的相关漏洞均已修复、本文中技术和方法仅用于教育目的&#xff1b;文中讨论的所有案例和技术均旨在帮助读者更好地理解相关安全问题&#xff0c;并采取适当的防护措施来保护自身系统免受攻击。二.大概流程1. 外网打点• 漏洞利…

iTwin 几何属性获取

面积体积半径获取几何属性&#xff0c;如面积&#xff0c;体积&#xff0c;半径&#xff0c;可以使用getMassProperties这个接口async onGetMassProperty(){const vp IModelApp.viewManager.selectedView;const iModel vp?.iModel;if (!iModel) return;console.log("iM…

OpenLayers 快速入门(九)Extent 介绍

看过的知识不等于学会。唯有用心总结、系统记录&#xff0c;并通过温故知新反复实践&#xff0c;才能真正掌握一二 作为一名摸爬滚打三年的前端开发&#xff0c;开源社区给了我饭碗&#xff0c;我也将所学的知识体系回馈给大家&#xff0c;助你少走弯路&#xff01; OpenLayers…

LeetCode 121. 买卖股票的最佳时机 LeetCode 122. 买卖股票的最佳时机II LeetCode 123.买卖股票的最佳时机III

LeetCode 121. 买卖股票的最佳时机尝试一&#xff1a;暴力解决方法常用两个指针去遍历prices数组&#xff0c;dp[i]用于记录在第i天所获得的最大利润。时间复杂度是O(N^2)&#xff0c;超出时间限制。Codeclass Solution(object):def maxProfit(self, prices):"""…

【LeNet网络架构】——深度学习.卷积神经网络

目录 1 MLP 2 LeNet简介 3 Minst数据集 3.1 MINST数据集简介 3.2 MNIST数据集的预处理 4 LeNet手写数字识别 LeNet由Yann Lecun 提出&#xff0c;是一种经典的卷积神经网络&#xff0c;是现代卷积神经网络的起源之一。Yann将该网络用于邮局的邮政的邮政编码识别&#xff…

Python笔记完整版

常用pip源 &#xff08;1&#xff09;阿里云 http://mirrors.aliyun.com/pypi/simple/&#xff08;2&#xff09;豆瓣 http://pypi.douban.com/simple/&#xff08;3&#xff09;清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/&#xff08;4&#xff09;中国科学技术大学…

2025 鸿蒙创新赛又来了,万少教你如何强势切入 HarmonyOS AI特性

2025 鸿蒙创新赛又来了&#xff0c;万少教你如何强势切入 前言 ​ 2025 华为HarmonyOS 创新赛又来了&#xff0c;创新赛是鸿蒙生态最大规模开发者官方赛事&#xff0c;最高获百万激励。 参赛资格 面向所有开发者开放以队伍的形式来参加&#xff0c;可以一个人报名一个队伍&a…

【智能模型系列】Unity通过访问Ollama调用DeepSeek模型进行本地部署

【智能模型系列】Unity通过访问Ollama调用DeepSeek模型进行本地部署 目录 一、前言 二、环境准备 三、核心代码解析 1、参数配置 2. CallDeepSeek.cs - API交互控制器 3、 MainPanel.cs - 用户界面控制器 四、源码 一、前言 在本教程中,我将分享如何在Unity中集成本地…

什么是5G-A三防平板?有什么特点?哪些领域能用到?

在工业自动化与数字化转型浪潮中&#xff0c;三防平板电脑已成为“危、急、特”场景的核心工具。这类设备不仅具备坚固耐用的物理防护特性&#xff0c;更融合了先进的通信技术与智能处理能力。而随着5G技术向5G-A阶段演进&#xff0c;新一代三防平板正为行业应用注入全新动能。…

Flink实时流量统计:基于窗口函数与Redis Sink的每小时PV监控系统(学习记录)

题目&#xff1a;利用flink统计网站浏览量&#xff0c;并写入redis。利用窗口函数以及算子实现每小时PV&#xff08;网站的页面浏览量&#xff09;统计&#xff0c;对统计后结果数据格式进行设计&#xff0c;存储至Redis中&#xff08;利用sink将处理后结果数据输出到redis数据…