Netty通信框架

Netty框架的底层是NIO,NIO:non-blocking io 非阻塞IO

一个线程可以处理多个通道,减少线程创建数量;

读写非阻塞,节约资源:没有可读/可写数据时,不会发生阻塞导致线程资源的浪费

一、NIO三大组件

1.Channel&&Buffer

channel:

读写数据的双向通道,可以从channel将数据读入到buffer,也可以将buffer中的数据写入channel

buffer:

用来暂存数据的缓冲区

常见的channel有:
FileChannel - 文件传输的数据传输通道

DatagramChannel - UDP网络编程时的数据传输通道

SocketChannel - TCP网络编程时的数据传输通道    (客户端、服务器都能用)

ServerSocketChannel - TCP网络编程时的数据传输通道(专用于服务器)

二、Netty

Netty执行流程

Netty核心组件

1.Channel 数据通道:        

数据的载体,建立客户端和服务端通信的桥梁,连接成功后保存Channel通道。

2.EventLoop 与 EventLoopGroup:

Netty为每个Channel分配一个EventLoop,EventLoop 本身只是一个线程驱动,在其生命周期内只会绑定一个线程,让该线程处理一个 Channel 的所有 IO 事件,起到在Channel中处理数据的功能

3.ServerBootstrap 与 Bootstrap:
Bootstrap 是客户端的引导类,Bootstrap 在调用 bind()(连接UDP)和 connect()(连接TCP)方法时,会新创建一个 Channel,仅创建一个单独的、没有父 Channel 的 Channel 来实现所有的网络交换。

​ServerBootstrap 是服务端的引导类,ServerBootstarp 在调用 bind() 方法时会创建一个 ServerChannel 来接受来自客户端的连接,并且该 ServerChannel 管理了多个子 Channel 用于同客户端之间的通信。

Bootstrap来设置一些连接参数

4.ChannelHandler 与 ChannelPipeline:

ChannelHandler是消息处理器,封装在了ChannelPipeline对象中

ChannelPipeline来添加一些特定的处理器满足业务需求

5.ChannelFuture:

 Netty 中所有的 I/O 操作都是异步的,即操作不会立即得到返回结果,所以Netty定义了ChannelFuture来作为操作返回结果

    public Channel connect(String host , int port , ChannelInboundHandlerAdapter  handler, MessageToMessageEncoder encoder, ByteToMessageDecoder decoder) {EventLoopGroup  group = getEventLoopGroup();bootstrap = new Bootstrap();bootstrap.group(group);bootstrap.channel(NioSocketChannel.class);bootstrap.option(ChannelOption.TCP_NODELAY, true);      // 立即发送数据,设置了TCP_NODELAY选项为true,它的作用是禁用了Nagle算法。这意味着数据将被立即发送,不会等待小的数据块进行合并。bootstrap.option(ChannelOption.SO_KEEPALIVE, false);    // 用于控制操作系统是否发送保持活动(keep-alive)探测报文段来检测连接是否仍然活跃bootstrap.option(ChannelOption.ALLOW_HALF_CLOSURE, false);  // 全关闭(Full Closure):表示双方都关闭了连接,不再允许进行数据的读写操作。// 半关闭(Half Closure):表示一端关闭了连接,但另一端仍可以发送数据。// 当设置为true时,表示允许半关闭连接,即当远程端关闭连接时,本地端仍可以继续发送数据。bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 2000); //连接超时毫秒数bootstrap.option(ChannelOption.SO_RCVBUF, 64 * 1024); //TCP数据接收缓冲区大小bootstrap.option(ChannelOption.SO_SNDBUF, 46 * 1024); //TCP数据发送缓冲区大小// bootstrap.handler(new LoggingHandler(LogLevel.DEBUG));channelInitializer = new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline channelPipeline = ch.pipeline();// channelPipeline.addLast(new LoggingHandler(LogLevel.DEBUG));channelPipeline.addLast("decoder", decoder);channelPipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));channelPipeline.addLast("encoder", encoder);channelPipeline.addLast("handler", handler);}};bootstrap.handler(channelInitializer);try {ChannelFuture channelFuture = bootstrap.connect(host, port).syncUninterruptibly();if (channelFuture != null && channelFuture.isSuccess()) {logger.info("connect tcp server host = {}, port = {} success", host, port);return channelFuture.channel();} else {logger.error("connect tcp server host = {}, port = {} fail", host, port);}} catch (Exception e) {logger.error("connect to tcp server failed.", e);}return null;}

ChannelInboundHandlerAdapterMessageToMessageEncoderByteToMessageDecoder分别是Netty框架中的三个重要类,用于处理网络数据的编解码和处理。

  1. ChannelInboundHandlerAdapter是Netty中用于处理入站数据的抽象类。它提供了一系列的回调方法,可根据实际需求进行重写,用于处理不同的入站事件和操作。通常情况下,我们的自定义处理器需要继承该类,并且实现自定义的业务逻辑。

  2. MessageToMessageEncoder是一个编码器,用于将一种消息类型转换为另一种消息类型。它将一个出站消息对象转换为另一个出站消息对象,例如将一个POJO对象编码为字节数据。通过继承该抽象类并重写encode()方法,我们可以实现自定义的消息编码逻辑,以满足特定的协议或需求。

  3. ByteToMessageDecoder是一个解码器,用于将字节数据解码为其他形式的数据,如将字节数据解码为POJO对象或其他自定义消息对象。它将一个入站的字节缓冲区转换为出站消息对象。通过继承该抽象类并重写decode()方法,我们可以根据实际需求实现自定义的消息解码逻辑,以满足特定的协议或需求。

这三个类在Netty中的应用通常是组合使用的,用于构建完整的网络数据处理链。具体来说,ChannelInboundHandlerAdapter用于处理入站数据的不同事件和操作,MessageToMessageEncoder用于将出站消息对象编码为其他形式的消息对象,而ByteToMessageDecoder用于将入站的字节数据解码为其他形式的消息对象。通过灵活组合和重写这些类的方法,我们可以实现定制的网络数据处理逻辑。

其中ChannelInitializer 是一个用于初始化 SocketChannel 的抽象类。它的 initChannel() 方法会在每个新连接被接受时调用,用于配置该连接的 ChannelPipeline。

在 initChannel() 方法中,我们可以通过 channelPipeline 对象来设置和添加各种处理器(handlers)到 ChannelPipeline 中,以定义数据的处理流程。

在这段代码中,通过 channelPipeline 对象按照一定的顺序添加了以下处理器:

  1. decoder:这是一个 ByteToMessageDecoder,用于将入站的字节数据解码为其他形式的消息对象。
  2. StringDecoder:这是一个 Netty 提供的内置解码器,用于将入站的字节数据解码为字符串形式的消息对象。指定编码格式为 UTF-8
  3. encoder:这是一个 MessageToMessageEncoder,用于将出站消息对象编码为其他形式的消息对象。
  4. handler:这是一个自定义的 ChannelInboundHandlerAdapter,用于处理入站数据的不同事件和操作。

通过这样的方式,我们可以构建一个完整的数据处理流程,根据实际需求来解码、编码和处理网络消息。在 ChannelInitializer 的 initChannel() 方法中,我们可以按照需求自由添加或修改处理器,以满足特定的业务需求。

ChannelFuture channelFuture = bootstrap.connect(host, port).syncUninterruptibly();

这段代码是使用 bootstrap 对象创建一个客户端连接,并返回一个 ChannelFuture 对象。

以下是代码的执行步骤:

  1. bootstrap.connect(host, port):使用指定的主机和端口号,创建一个连接到目标服务器的操作,并返回一个 ChannelFuture 对象。
  2. .syncUninterruptibly():阻塞当前线程,等待连接操作完成。syncUninterruptibly() 方法会阻塞当前线程,直到连接操作完成或发生异常,而不会响应中断。
  3. channelFuture:连接操作完成后,返回一个 ChannelFuture 对象,可以通过该对象获取操作的结果。

通过这段代码,可以同步地创建一个客户端连接,并在连接操作完成后获取连接的 ChannelFuture 对象,以便后续的操作和处理。

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

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

相关文章

pytorch打印模型结构和参数

两种方式 当我们使用pytorch进行模型训练或测试时&#xff0c;有时候希望能知道模型每一层分别是什么&#xff0c;具有怎样的参数。此时我们可以将模型打印出来&#xff0c;输出每一层的名字、类型、参数等。 常用的命令行打印模型结构的方法有两种&#xff1a; 一是直接prin…

cpolar+JuiceSSH实现手机端远程连接Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

06、Caused by: java.nio.charset.MalformedInputException: Input length = 1

目录 问题&#xff1a;原因&#xff1a;解决方法&#xff1a; 问题&#xff1a; Caused by: java.nio.charset.MalformedInputException: Input length 1 原因&#xff1a; 应该是中文有哪些文字导致的。 yml 编码格式出错 解决方法&#xff1a; 直接这里把GBK改成 utf-8…

底层驱动day8作业

代码&#xff1a; //驱动程序 #include<linux/init.h> #include<linux/module.h> #include<linux/of.h> #include<linux/of_gpio.h> #include<linux/gpio.h> #include<linux/timer.h>struct device_node *dnode; //unsigned int gpiono; …

职场好物:乐歌M9S升降办公电脑台,告别久坐办公,升职加薪就选它

办公是现代生活不可避免的组成部分&#xff0c;科技的快速发展&#xff0c;给了我们更多新的生活方式&#xff0c;促使我们更加关注自己的身体状况&#xff0c;我们挨过了饭都吃不饱的年代&#xff0c;随着办公人群的不断扩张&#xff0c;不知道你有没有发现身边人或多或少都有…

CHAT——新手必看的文章

今天小编用CHAT写一篇文章&#xff1a;Ipad新手注意事项&#xff0c;一定要看。 标题&#xff1a;iPad新手必读&#xff1a;一篇你绝对不能错过的关于iPad使用的注意事项 当你买了一台全新的iPad&#xff0c;无论是为了工作还是娱乐&#xff0c;这款强大而引人入胜的设备都提供…

这三种方法轻松实现Excel文档名翻译

在电脑使用中&#xff0c;我们常常需要批量修改文件名并翻译。这时候&#xff0c;我们可以使用“固乔文件管家”软件来轻松实现这一需求。下面就介绍三种方法&#xff0c;帮助你轻松实现Excel文档名翻译。 方法一&#xff1a;使用“固乔文件管家”软件批量修改文件名 1.安装并打…

KaiwuDB 获山东省工信厅“信息化应用创新优秀解决方案”奖

10月23日&#xff0c;山东省工信厅正式公示《2023年山东省信息化应用创新典型应用案例及优秀解决方案名单》&#xff0c;面向全省、全国重点推荐山东省技术水平先进、应用示范效果突出、产业带动性强的信息化解决方案及应用实践&#xff0c;对于进一步激发山东省信息技术产业创…

SpringBoot -- 请求数据多态映射(jackson)

有些情况下&#xff0c;服务端提供了一个抽象类及其多个实现类&#xff0c;当前端传递 json 数据到后端时&#xff0c;我们希望映射得到的对象数据是根据某个特征区分开的具体的实现类对象。 文章目录 实现方式示例抽象类对象若干实现类测试接口及前端传递请求体接参结果 JsonT…

两个字符串的最小ASCII删除和

题目描述 给定两个字符串s1 和 s2&#xff0c;返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 。 示例 思路 这个题的解法一和最长公共子序列的解法大致相同&#xff0c;我们可以在此代码基础上稍微更改即可。 代码如下 解法一 public int minimumDeleteSum1(Stri…

MetaAI提出全新验证链框架CoVE,大模型也可以通过“三省吾身”来缓解幻觉现象

​ 论文名称&#xff1a; Chain-of-Verification Reduces Hallucination in Large Language Models 论文链接&#xff1a; https://arxiv.org/abs/2309.11495 曾子曰&#xff1a;“吾日三省吾身” --出自《论语学而》 时至今日&#xff0c;生成幻觉&#xff08;hallucination&…

案例分析真题-质量属性

案例分析真题-质量属性 2009 年真题 【问题1】 【问题2】 2011 年真题 【问题1】 骚戴理解&#xff1a;首先要知道这样的题目没有可靠性&#xff0c;只有可用性&#xff0c;更没有容错性&#xff0c;这里我&#xff08;3&#xff09;写成了i&#xff0c;而不是f&#xff0c;仔…

众和策略:微软大动作

当地时间周二&#xff0c;美股首要指数全线收涨。但从月度数据来看&#xff0c;美股首要指数录得“三连跌”&#xff0c;10月份&#xff0c;道指跌1.36%&#xff0c;标普500指数跌2.2%&#xff0c;纳指跌2.78%。其间&#xff0c;标普和道指均为2020年3月以来初次呈现三个月连跌…

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现 1、DW卷积与普通卷积计算量对比DW与PW计算量普通卷积计算量计算量对比 2、MobileNet V1MobileNet V1网络结构MobileNet V1网络结构代码 3、MobileNet V2倒残差结构模块倒残…

linux系统的环境变量-搞清环境变量到底是什么

环境变量 引例环境变量常见的环境变量echoexportenvunsetset 通过代码获取环境变量使用第三个参数获取使用全局变量enviorn获取环境变量通过系统调用获取环境变量 环境变量具有全局属性main函数前两个参数的作用 引例 在linux系统中&#xff0c;我们使用ls命令&#xff0c;直接…

模型实际训练笔记1—AlexNet

1、AlexNet网络模型介绍&#xff1a; AlexNet 是一种深度卷积神经网络&#xff0c;由Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在2012年开发。它是深度学习领域的重要里程碑&#xff0c;因为它在当年的 ImageNet 大规模图像分类竞赛&#xff08;ILSVRC&#xff09…

pc通过window.open打开新页面,新页面要使用原来页面的token

原文链接&#xff1a; https://blog.csdn.net/weixin_42342065/article/details/127420783 (以下为本人笔记使用) 对于前端来说&#xff0c;一般在登录获取token之后会把token存入缓存以及放置在Request Headers请求头中&#xff0c;但是使用iframe/window.open/a这三种标签打…

微信小程序-授权登录(手机号码)

1、WXBizDataCrypt.js-下载地址 2、UNIAPP代码 <template> <view class"work-container"> <view class"login"> <view class"content"> <button class"button_wx&q…

(四)上市企业实施IPD成功案例分享之——天士力

众所周知&#xff0c;药物有创新药和仿制药两种&#xff0c;其实这是根据新药研发的方式划分的&#xff0c;而创新药则经历一个从无到有的过程。无论是仿制药还是创新药&#xff0c;都是基于市场需求为前提进行的研发过程&#xff0c;药物研发立项同样需要满足治疗人类的疾病&a…

Android 13 Handler详解

1.Handler 简介 Handler 是一套 Android 消息传递机制。在多线程应用场景中&#xff0c;将子线程中需要更新 UI 的操作消息&#xff0c;传递到 UI 主线程&#xff0c;从而实现子线程通知 UI 更新最终实现异步消息处理。说白了是用于线程之间的通信。 Handler主要有4个重要类&a…