Netty5 入门HelloWorld

在这里插入图片描述

一、客户端代码及关键类说明

/*** netty5的客户端* @author -zhengzx-**/
public class ClientSocket {public static void main(String[] args) {//服务类Bootstrap bootstrap = new Bootstrap();//workerEventLoopGroup worker = new NioEventLoopGroup();try {//设置线程池bootstrap.group(worker);//设置socket工厂bootstrap.channel(NioSocketChannel.class);//设置管道bootstrap.handler(new ChannelInitializer<Channel>() {@Overrideprotected void initChannel(Channel ch) throws Exception {ch.pipeline().addLast(new StringDecoder());ch.pipeline().addLast(new StringEncoder());ch.pipeline().addLast(new ClientSocketHandler());}});ChannelFuture connect = bootstrap.connect("127.0.0.1", 10101);BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));while(true){System.out.println("请输入:");String msg = bufferedReader.readLine();connect.channel().writeAndFlush(msg);}} catch (Exception e) {e.printStackTrace();} finally{worker.shutdownGracefully();}}
}

【1】EventLoopGroup 客服端需要指定EvnetLoopGroupNetty5中实例为NioEventLoopGroup:表示一个NIOEvnetLoopGroup
【2】ChannelType 指定 Channel 的类型,客户端为NioSocketChannel。在Netty中,Channel是一个Socket的抽象,它为用户提供了关于Socket状态(是否连接还是断开) 以及对Socket的读写等操作。每当 Netty 建立了一个连接后, 都会有一个对应的 Channel实例。
【3】Handler 设置数据的处理类。

public class ClientSocketHandler extends SimpleChannelInboundHandler<String>{@Overrideprotected void messageReceived(ChannelHandlerContext ctx, String msg) throws Exception {System.out.println("客户端接受消息:"+msg);}
}

【4】ChannelPipeline 在实例化一个Channel时,必然伴随着实例化一个ChannelPipeline

二、服务端代码及说明

【1】EventLoopGroup 不论是服务器端还是客户端,都必须指定EventLoopGroup. 在这个例子中, 指定了NioEventLoopGroup, 表示一个NIOEventLoopGroup, 不过服务器端需要指定两个EventLoopGroup, 一个是bossGroup, 用于处理客户端的连接请求; 另一个是workerGroup, 用于处理与各个客户端连接的IO操作。
【2】ChannelType 指定Channel的类型. 因为是服务器端, 因此使用了NioServerSocketChannel
【3】Handler 设置数据的处理器。

public class ServerSocketHandler extends SimpleChannelInboundHandler<String>{@Overrideprotected void messageReceived(ChannelHandlerContext ctx, String msg) throws Exception {System.out.println(msg);//返回字符串ctx.writeAndFlush("hi");}}

三、Netty5 与 Netty4/Netty3的区别

Netty4Netty5的主要区别在于它们的版本更新以及一些新特性的添加。Netty5是对Netty3的后续版本,因此在架构上进行了一些重大调整,增加了许多新的功能和特性,使得其复杂性相较于Netty3有所增加。然而,Netty4Netty5的设计方式相似,因此它们之间的差异并不是特别大。简而言之,Netty5提供了比Netty3更多的高级功能和新特性,而Netty4不再作为单独的版本维护,因为它与Netty5的设计和实现相类似。

netty5的复杂性相对于netty3要多一些。架构基本被重构了。所以这里主要是介绍一些属性和用法。

核心的变化主要有:
【1】支持Android,使得移动设备变的更加强大;
【2】通过Ice Cream Sandwich解决了在ADK中最著名的与NIOSSLEngine相关的问题,且用户显然想要重用他们应用中的的编解码和处理器代码;
【3】我们决定官方支持Android(4.0及以上版本)

简化处理器层次:
【1】ChannelInboundHandlerChannelOutboundHandler整合为ChannelHandlerChannelHandler现在包含输入和输出的处理方法。
【2】ChannelInboundHandlerAdapterChannelOutboundHandlerAdapterChannelDuplexHandlerAdapter已被废弃,由ChannelHandlerAdapter代替。
【3】由于现在无法区分处理器handler)是输入还是输出的处理器,CombinedChannelDuplexHandler现在由ChannelHandlerAppender代替。

Channel.deregister()已被移除。不再生效和被使用。取而代之的,我们将允许Channel被充注册到不同的事件循环。

ChannelHandlerContext.attr(..) == Channel.attr(..)

Channel和ChannelHandlerContext类都实现了AttributeMap接口,使用户可以在其上关联一个或多个属性。有时会让用户感到困惑的是ChannelChannelHandlerContext都有其自己的存储用户定义属性的容器。例如,即使你通过Channel.attr(KEY_X).set(valueX)给属性'KEY_X’赋值,你却无法通过ChannelHandlerContext.attr(KEY_X).get()方法获取到值。反之亦是如此。这种行为不仅仅令人不解而且还浪费内存。

为了解决这个问题,我们决定每个Channel内部仅保留一个mapAttributeMap总是用AttributeKey作为它的keyAttributeKey确保键的唯一性,因此每个Channel中如果存在一个以上的属性容易是多余的。只要用户把他自己的AttributeKey定义成ChannelHandlerprivate static final变量,就不会有出现重复key的风险。

更简单更精确的缓冲区泄漏追踪: 之前,查找缓冲区泄漏是很困难的,并且泄漏的警告信息也不是很有帮助。现在我们有了增强的泄漏报告机制,该机制会在增长超过上限时触发。

PooledByteBufAllocator成为默认的allocator4.x版本中UnpooledByteBufAllocator是默认的allocator,尽管其存在某些限制。现在PooledByteBufAllocator已经广泛使用一段时间,并且我们有了增强的缓冲区泄漏追踪机制,所以是时候让PooledByteBufAllocator成为默认了。
全局唯一的Channel ID 每个Channel现在有了全局唯一的ID,其生成的依据是:

  • MAC地址(EUI-48或是EUI-64),最好是全局唯一的进程ID
  • System#currentTimeMillis()
  • System#nanoTime()
  • 随机的32位整数,以及系列递增的32位整数;

可通过Channel.id()方法获取ChannelID

更灵活的线程模型: 增加了新的ChannelHandlerInvoker接口,用于使用户可以选择使用哪个线程调用事件处理方法。替代之前的在向ChannelPipeline添加ChannelHandler时指定一个EventExecutor的方式,使用该特性需要指定一个用户自定义的ChannelHandlerInvoker实现。

EmbeddedChannel的易用性: EmbeddedChannel中的readInbound()readOutbound()方法返回专门类型的参数,因此你不必在转换他们的返回值。这可以简化你的测试用例代码。

EmbeddedChannel ch = ...;// BEFORE:
FullHttpRequest req = (FullHttpRequest) ch.readInbound();// AFTER:
FullHttpRequest req = ch.readInbound();

使用Executor代替ThreadFactory: 有些应用要求用户使用Executor运行他们的任务。4.x版本要求用户在创建事件循环event loop时指定ThreadFacotry,现在不再是这样了。

Class loader友好化: 一些类型,如AttributeKey对于在容器环境下运行的应用是不友好的,现在不是了。

编解码和处理器handlers

  • XmlFrameDecoder支持流式的XML文档;
  • 二进制的memcache协议编解码;
  • 支持SPDY/3.1 (也移植到了4.x版本);
  • 重构了HTTP多部分的编解码;

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

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

相关文章

RC正弦波振荡电路

RC正弦波振荡电路 RC正弦波振荡电路又称文氏电桥振荡电路&#xff0c;可以设计频率为f1/2πRC的正弦波发生器。 RC正弦波振荡电路设计&#xff1a;50Hz,振幅为3.47V 电路分析&#xff1a; 1.起振条件取决于R1, R4&#xff0c;R2与1N4148并联电阻&#xff08;下面简称Rf&#…

B端系统:OA界面设计,把用户当傻瓜吧, 少让用户吃瓜

OA系统是稍具规模的企业最常用的系统&#xff0c;有些OA系统体验非常逆天&#xff0c;把用户当成了吃瓜群众&#xff0c;看看热闹还行&#xff0c;一旦上手操作就抓瞎了&#xff0c;大千UI工场结合自身经验对这个问题进行分析&#xff0c;希望可以抛砖引玉。 一、OA概述 OA系…

【飞桨EasyDL】飞桨EasyDL发布的模型转换onnx(附工程代码)

一个愿意伫立在巨人肩膀上的农民...... 一、paddle转onnx转rknn环境搭建 paddle转onnx和onnx转rknn两个环境可以分开搭建&#xff0c;也可以搭建在一起。这里选择分开搭建&#xff0c;先搭建paddle转onnx。 1.1、创建环境 选择python3.8.13包进行创建环境 conda create --nam…

Day09:基础入门-算法逆向散列对称非对称JS源码逆向AESDESRSASHA

目录 算法加密-概念&分类&类型 加密解密-识别特征&解密条件 解密实例-密文存储&数据传输 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&am…

电子科技大学《数据库原理及应用》(持续更新)

前言 电子科技大学的数据库课程缩减了部分的课时&#xff0c;因此&#xff0c;可能并不适合所有要学习数据库的宝子们&#xff0c;但是&#xff0c;本人尽量将所有数据库的内容写出来。本文章适用于本科生的期中和期末的复习&#xff0c;电子科技大学的考生请在复习前先看必读…

MySQL相关知识汇总

MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;它以其高性能、稳定性和易用性而备受开发者喜爱。在软件开发领域&#xff0c;无论是大型项目还是小型应用&#xff0c;MySQL都扮演着重要的角色。本文将对MySQL的一些关键知识点进行汇总&#xff0c;帮助读者更好地了…

5. informer源码分析-概要分析

k8s client-go k8s informers 实现了持续获取集群的所有资源对象、监听集群的资源对象变化功能&#xff0c;并在本地维护了全量资源对象的内存缓存&#xff0c;以减少对 apiserver、对 etcd 的请求压力。Informers 在启动的时候会首先在客户端调用 List 接口来获取全量的对象集…

C++中boost库的安装及使用(Windows)

Boost库的安装及使用 引言使用现有的boost库安装及使用引言 C++开发中经常会用到boost库,本文记录一下Windows上boost在visual studio2019上的使用。 Boost库是一个跨平台的C++库集合,旨在为C++开发者提供一系列高质量的通用功能。不同的Visual Studio(VS)版本并不要求安…

日常科研中经常使用的命令

Linux目录树状结构 1. Windows是磁盘分区&#xff0c;Linux不区分盘符&#xff0c;所有文件都在根目录斜线下面&#xff1b; 2. 根目录显示不同&#xff0c;Linux是一个斜线&#xff0c;而windows是盘符&#xff0c;然后冒号&#xff1b; 3. 分割目录Linux用斜线&#xff0c…

React编写组件时,如何省略.tsx后缀

省略.tsx后缀 当tsconfig.json配置了&#xff0c;需要重启后才会生效 {"compilerOptions": {"allowJs": true,"jsx": "react-jsx",} }当进行以上配置后&#xff0c;导入组件时添加后缀&#xff0c;Eslint报错如下&#xff1a; An im…

【算法集训】基础算法:基础排序 - 冒泡排序

一、基本理解 贴上图解&#xff0c;更容易理解代码&#xff1a;https://visualgo.net/zh/sorting 冒泡排序(Bubble Sort)又称为泡式排序&#xff0c;是一种简单的排序算法。 核心思想&#xff1a; 它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它…

性能比较:in和exists

当在Hive SQL中使用NOT IN和NOT EXISTS时&#xff0c;性能差异主要取决于底层数据的组织方式、数据量大小、索引的使用情况以及具体查询的复杂程度。下面是对这两种方法的性能分析&#xff1a; 1. NOT IN&#xff1a;- 工作原理&#xff1a;NOT IN子查询会逐个比较主查询中的值…

化肥工业5G智能制造工厂数字孪生可视化平台,推进化肥行业数字化转型

化肥工业5G智能制造工厂数字孪生可视化平台&#xff0c;推进化肥行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的必然趋势。在化肥工业领域&#xff0c;5G智能制造工厂数字孪生可视化平台的应用正在逐渐普及&#xff0c;为行业数字化转型提供…

Java 循环结构 - while ,do…while 及 for,

目录 Java中有三种主要的循环结构&#xff1a; while 循环 实例 do…while 循环 实例 for循环 实例 三种循环之间的区别 增强 for 循环 实例 break 关键字 语法 实例 continue 关键字 语法 实例 顺序结构的程序语句只能被执行一次。 如果您想要同样的操作执行…

租用云服务器租时要注意的问题有哪些?

随着云计算的不断发展&#xff0c;对云计算服务器的需求也越来越大。 那么&#xff0c;我们应该如何以正确的态度和方法来选择云服务器呢&#xff1f; 租用云服务器需要注意哪些问题&#xff1f; 1.了解您需要的云服务类型 了解您的云计算需求将使您了解您正在寻求的服务类型…

web运行时安全

1.输入验证 对传递的数据的格式、长度、类型&#xff08;前端和后端都要&#xff09;进行校验。 对黑白名单校验&#xff1a;比如前端传递了一个用户名&#xff0c;可以搜索该用户是否在白名单或者黑名单列表。 针对黑名单校验&#xff0c;比如&#xff1a; // 手机号验证…

让两个电脑通信的方法(TCP连接,UDP连接,C/S架构)

目录 TCP-面向连接UDP-面向无连接C/S架构服务器和客户端的工作过程C/S架构例子 让两个电脑通信的方法是 在C/S的基础上&#xff0c;采用TCP和UDP的方式连接 TCP-面向连接 UDP-面向无连接 C/S架构 服务器和客户端的工作过程 C/S架构例子 服务器与客户端通信的过程类似公司与客户…

微信小程序云开发教程——墨刀原型工具入门(添加交互事件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

殿堂级Flink源码极精课程预售

一、为什么我们要读源码? 1、让个人技术快速成长: 优秀的开源框架,底层的源码设计思想也非常优秀,同时还有含有大量的设计模式和并发编程技术&#xff0c;优秀的解决方案,熟读源码对猿们技术提升有很大帮助 2、新技术学习能力: Java开源码框架的源码熟读后&#xff0c;若出现…

第一篇:参考资料地址

javaGuide JavaGuide&#xff08;Java学习&面试指南&#xff09; | JavaGuide 清华学生总结的 小林coding labuladong labuladong 的算法笔记 | labuladong 的算法笔记 【华仔说技术】kafka的系列文章 https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg3MTcxMDgxNA…