Netty5 入门HelloWorld

在这里插入图片描述

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

/**
 * netty5的客户端
 * @author -zhengzx-
 *
 */
public class ClientSocket {

    public static void main(String[] args) {
        //服务类
        Bootstrap bootstrap = new Bootstrap();
        //worker
        EventLoopGroup worker = new NioEventLoopGroup();
        
        try {
            //设置线程池
            bootstrap.group(worker);
            //设置socket工厂
            bootstrap.channel(NioSocketChannel.class);
            //设置管道
            bootstrap.handler(new ChannelInitializer<Channel>() {

                @Override
                protected 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>{

    @Override
    protected 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>{

    @Override
    protected 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多部分的编解码;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ-TTL/死信队列/延迟队列高级特性

文章目录 TTL死信队列消息成为死信的三种情况队列如何绑定死信交换机 延迟队列RabbitMQ如何实现延迟队列 总结来源B站黑马程序员 TTL TTLTTL(Time To Live):存活时间/过期时间当信息到达存活时间后&#xff0c;还没有被消费&#xff0c;会被自动清除。RabbitMQ可以对消息设置过…

【Web安全靶场】sqli-labs-master 54-65 Challenges 与62关二分法和like模糊搜索

sqli-labs-master 54-65 Challenges 其他关卡和靶场见专栏… 文章目录 sqli-labs-master 54-65 Challenges第五十四关-联合注入第五十五关-联合注入第五十六关-联合注入第五十七关-联合注入第五十八关-报错注入第五十九关-报错注入第六十关-报错注入第六十一关-报错注入第六十…

前端学习第三天-css基础

1. CSS简介 从HTML被发明开始&#xff0c;样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制。最初的HTML只包含很少的显示属性。 随着HTML的成长&#xff0c;为了满足页面设计者的要求&#xff0c;HTML添加了很多显示功能。但是随着这些功能…

消息队列+更新DB极易引发的DB并发修改bug

背景 我们在生产系统中和其他系统进行交互时一般都会通过消息队列来解耦生产者和消费者&#xff0c;然后通过每个使用方消费消息队列的消息的方式来完成消息的消费&#xff0c;并且一般来说我们消费消息后极有可能会操作DB&#xff0c;不过这种方式如果处理不够仔细&#xff0…

YOLOv9改进|加入AKConv模块!

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 AKConv是一种具有任意数量的参数和任意采样形状的可变卷积核&#xff0c;对不规则特征有更好的提取效果。 论文速览&#xff1a;&am…

44岁香港乐队主唱无惧身份悬殊娶「十亿千金」,乐队因欠沟通解散

「豪门驸马」这个头衔听起来似乎是「人生赢家」&#xff0c;可其中无非就是想内涵女强男弱&#xff0c;靠老婆之类的意思&#xff0c;所以大部分男艺人都很排斥。 香港知名乐队Mr. 的主唱布志纶(Alan) 自从2014年娶了「玩具大王」千金陈雪莹后&#xff0c;也被外界封为「十亿驸…

H12-821_98

98.如图所示的广播网络中&#xff0c;OSPF运行在四台路由器上&#xff0c;且在同一区域和同一网段。OSPF会自动选举一个DR和一个BDR,其余的两台路由器会成为DRother,从而达到更好的备份效果。 A.对 B.错 答案&#xff1a;A 注释&#xff1a; 这道题需要注意的是&#xff0c;在…

Jupyter Notebook的安装和使用(windows环境)

一、jupyter notebook 安装 前提条件&#xff1a;安装python环境 安装python环境步骤&#xff1a; 1.下载官方python解释器 2.安装python 3.命令行窗口敲击命令pip install jupyter 4.安装jupyter之后&#xff0c;直接启动命令jupyter notebook,在默认浏览器中打开jupyte…

vulhub中Aapache Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)

查看tomcat默认页面&#xff0c;此时通过AJP协议的8009端口亦可访问Tomcat。 利用如下工具均可测试漏洞&#xff1a; https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi 工具需要用到python2&#xff0c; 如果需要进一步利用需要向服务器的/webapps/ROOT目录下上传…

续上一篇---Jetson Xavier NX 开发板Yolov4 环境搭建和摄像头实时检测教程

1.已成功安装完CUDA&#xff0c;OpenCV&#xff0c;cuDNN&#xff0c;配置如下&#xff1a; 2.下载yolov4 自行去GitHub下载&#xff0c;然后再导入NX中&#xff0c;这样比较快且不容易出错。 https://github.com/AlexeyAB/darknet.git 3.配置 下载好包后解压缩&#xff0c;进…

性能优化篇(四) GPU Instancing

使用GPU Instancing可以在一个Draw Call中同时渲染多个相同或类似的物体&#xff0c;从而减少CPU和GPU的开销。 官方文档&#xff1a;https://docs.unity3d.com/Manual/GPUInstancing.html 启用GPU Instancing&#xff0c;我们可以选中一个材质&#xff0c;然后在Inspector窗口…

云天励飞战略投资神州云海,布局机器人市场

日前,AI上市企业云天励飞(688343.SH)完成了对深圳市神州云海智能科技有限公司(以下简称“神州云海”)的B轮战略投资。 公开资料显示,自2015年于深圳创立以来,神州云海始终聚焦人工智能与服务机器人广阔的应用市场,依托自主的核心算法能力,深耕机器人硬件本体研发,整合上下游产…

Java 学习和实践笔记(26):组合(component)的含义以及与继承(extends)的关系

组合的两个作用&#xff1a; 1&#xff09;通过将父类对象作为子类的属性 2&#xff09;通过第1点的作用&#xff0c;实现了代码复用。 示例代码&#xff1a; public class TestComponent {public static void main(String[] args) {Student2 s1 new Student2("jason&…

Zookeeper4:Java客户端、应用场景以及实现、第三方客户端curator工具包

文章目录 Java连接Zookeeper服务端依赖代码使用 应用场景统一命名服务统一配置管理统一集群管理服务器节点动态上下线理解实现模拟服务提供者【客户端代码】-注册服务模拟服务消费者【客户端代码】-获取服务信息进行请求消费 软负载均衡分布式锁理解实现 生产集群安装N台机器合…

【CV论文精读】【语义分割】【FCN】Fully Convolutional Networks for Semantic Segmentation

FCN–Fully Convolutional Networks for Semantic Segmentation 用于语义分割的全卷积网络 建议参考这篇博客阅读论文 FCN网络解析 0.论文摘要和作者信息 摘要 卷积网络是强大的可视化模型&#xff0c;可以产生特征层次。我们表明&#xff0c;卷积网络本身&#xff0c;经过端…

springboot220基于SpringBoot+Vue的周边游平台个人管理模块的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考。 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项目编号&…

nginx-1.24编译安装

1.创建压缩包存放路径 [rootlocalhost /]# mkdir -p /apps/scripts [rootlocalhost /]# cd apps/scripts/2.上传所需文件 3.初始化环境 [rootlocalhost scripts]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c …

Softmax 回归 + 损失函数 + 图片分类数据集【动手学深度学习v2】李沐动手学深度学习课程笔记

目录 Softmax回归 损失函数 图片分类数据集 Softmax回归从零开始实现 Softmax回归简洁实现 Softmax回归 回归和分类的区别 回归问题举例上节课的预测房价问题&#xff0c;分类问题就是对样本进行分类 回归和分类的具体区别 假设真实的类别为第i个类别&#xff08;值为1&#x…

springcloud项目,无法在Sentinel Dashboard查看到服务的访问监控信息【解决方法】

1.问题场景 因为warehouse子项目的前端未开发&#xff0c;所以只能通过postman测试接口访问&#xff1b; 2.解决方法 package org.sharetek.common.security.config;import cn.dev33.satoken.SaManager; import cn.dev33.satoken.filter.SaServletFilter; import cn.dev33.sat…

ESP32 web 对接华为云平台--MQTT协议

文章目录 前言一、MQTT协议二、如何使用MQTT协议对接华为云1.注册华为云账号2.设备接入中创建资源空间3.如何连接4.通过MQTT.fx工具做初步对接4.1 设置连接信息4.2 连接平台 5.查看平台设备信息 三. 设备测对接平台1.ESP测引入MQTT库2.编码2.1前端编码修改2.2 后端接口修改 3.M…