Netty概述及Hello word入门

news2024/11/26 12:40:48

目录

概述

Netty是什么

Netty的地位 

Netty的优势

HelloWord入门程序

目标

pom依赖

服务器端 

客户端 

运行结果 

入门把握理解


概述

Netty是什么

Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients.

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。用一句简单的话来说就是:Netty封装了JDK的NIO,让你用得更爽,你不用再写一大堆复杂的代码了。

Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。

Netty的地位 

Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位

以下的框架都使用了 Netty,因为它们有网络通信需求!

  • Cassandra - nosql 数据库
  • Spark - 大数据分布式计算框架
  • Hadoop - 大数据分布式存储框架
  • RocketMQ - ali 开源的消息队列
  • ElasticSearch - 搜索引擎
  • gRPC - rpc 框架
  • Dubbo - rpc 框架
  • Spring 5.x - flux api 完全抛弃了 tomcat ,使用 netty 作为服务器端
  • Zookeeper - 分布式协调框架

Netty的优势

  • Netty vs NIO,工作量大,bug 多
    • 需要自己构建协议
    • 解决 TCP 传输问题,如粘包、半包
    • epoll 空轮询导致 CPU 100%
    • 对 API 进行增强,使之更易用,如 FastThreadLocal => ThreadLocal,ByteBuf => ByteBuffer
  • Netty vs 其它网络应用框架
    • Mina 由 apache 维护,将来 3.x 版本可能会有较大重构,破坏 API 向下兼容性,Netty 的开发迭代更迅速,API 更简洁、文档更优秀
    • 久经考验,16年,Netty 版本
      • 2.x 2004
      • 3.x 2008
      • 4.x 2013
      • 5.x 已废弃(没有明显的性能提升,维护成本高)

HelloWord入门程序

目标

开发一个简单的服务器端和客户端

  • 客户端向服务器端发送 hello, world
  • 服务器仅接收,不返回

pom依赖

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.39.Final</version>
</dependency>

服务器端 

public class HelloServer {
    public static void main(String[] args) {

        new ServerBootstrap()
                //1 创建NioEventLoopGroup,可以简单理解为线程池+Selector
                .group(new NioEventLoopGroup())
                //2 选择服务Socket实现类,其中NioServerSocketChannel表示基于NIO的服务端实现
                .channel(NioServerSocketChannel.class)
                //3 添加的处理器都是给SocketChannel用的,而不是给ServerSocketChannel
                .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        //5 SocketChannel的处理器,解码ByteBuffer==>String
                        ch.pipeline().addLast(new StringDecoder());
                        //6 SocketChannel的业务处理器。使用上一个处理器的处理结果
                        ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
                            protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
                                System.out.println(s);
                            }
                        });
                    }
                })
        .bind(8080);//4 绑定的端口
    }
}

客户端 

public class HelloClient {
    public static void main(String[] args) throws InterruptedException {
        new Bootstrap()
                //1 创建NioEventLoopGroup通Server
                .group(new NioEventLoopGroup())
                //2 创建客户Socket实现类,NioSocketChannel表示基于NIO的客户端实现
                .channel(NioSocketChannel.class)
                //3 添加SocketChannel的处理器,ChannelInitializer处理器(仅执行一次),
                // 它的作用是待客户端SocketChannel建立连接以后,执行initChannel以便添加更多的处理器
                .handler(new ChannelInitializer<Channel>() {
                    protected void initChannel(Channel ch) throws Exception {
                        //8
                        ch.pipeline().addLast(new StringEncoder());
                    }
                })
                //4 指定要连接的服务器和端口
                .connect("127.0.0.1",8080)
                //5 Netty中的很多方法都是异步的,如connet,这时需要使用sync方法等待connect建立连接完毕
               .sync()
                //6获取channel对象,它即为通道抽象它可以进行读写操作
                .channel()
                //7 写入消息并清空缓冲区
                .writeAndFlush(new Date()+":hello word!");
    }
}

运行结果 

入门把握理解

  • 把 channel 理解为数据的通道
  • 把 msg 理解为流动的数据,最开始输入是 ByteBuf,但经过 pipeline 的加工,会变成其它类型对象,最后输出又变成 ByteBuf
  • 把 handler 理解为数据的处理工序
    • 工序有多道,合在一起就是 pipeline,pipeline 负责发布事件(读、读取完成...)传播给每个 handler, handler 对自己感兴趣的事件进行处理(重写了相应事件处理方法)
    • handler 分 Inbound 和 Outbound 两类
  • 把 eventLoop 理解为处理数据的工人
    • 工人可以管理多个 channel 的 io 操作,并且一旦工人负责了某个 channel,就要负责到底(绑定)
    • 工人既可以执行 io 操作,也可以进行任务处理,每位工人有任务队列,队列里可以堆放多个 channel 的待处理任务,任务分为普通任务、定时任务
    • 工人按照 pipeline 顺序,依次按照 handler 的规划(代码)处理数据,可以为每道工序指定不同的工人

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

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

相关文章

VITS语音生成模型详解及中文语音生成训练

1 VITS模型介绍 VITS&#xff08;Variational Inference with adversarial learning for end-to-end Text-to-Speech&#xff09;是一种结合变分推理&#xff08;variational inference&#xff09;、标准化流&#xff08;normalizing flows&#xff09;和对抗训练的高表现力语…

基于技能的工程方法及其在I4.0 中的应用

工业4.0 组件描述了两种架构&#xff0c;一种是面向服务的紧耦合分层系统架构&#xff0c;另一种基于协议的同层架构&#xff08;peer-to-peer&#xff09;。传统的工业自动化系统几乎都是分层架构。例如现场设备&#xff08;PLC&#xff09;将数据传送到控制中心&#xff0c;S…

如何在华为OD机试中获得满分?Java实现【不爱施肥的小布】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…

第6章 Constant, Static and Name Space

Const • declares a variable to have a constant value const int x 123; x 27; // illegal! x; // illegal! int y x; // Ok, copy const to non-const y x; // Ok, same thing const int z y; // ok, const is safer 变量variable 常量 constant &#x…

chatgpt赋能python:Python词性标注:一个重要的NLP应用

Python 词性标注&#xff1a;一个重要的 NLP 应用 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是 AI 领域中的重要分支之一&#xff0c;其可以帮助机器理解和处理人类语言。在 NLP 任务中&#xff0c;词性标注&#xff08;Part-of-Speec…

k8s+负载均衡+防火墙

目录 实验拓扑 实验要求 实验部署 一、kubeadm部署k8s集群 1、环境准备&#xff08;所有节点&#xff09; 2、所有节点安装docker 3、所有节点安装Kubeadm、Kubelet和Kuberctl 4、部署k8s集群 初始化kubeadm 设置kubectl 5、部署网络插件flannel&#xff08;所有节点…

[CSS案例二]—实现一个响应式网页,兼容PC移动端,ScrollReveal 增加动画

大家好&#xff0c;我是小张 本期案例&#xff0c;用前端三件套实现一个简约的响应式布局网页&#xff0c;当屏幕分辨率自适应改变时网页布局会自动发生切换&#xff0c;网页布局同时兼容PC端和移动端&#xff0c; 在普通PC屏幕下网页布局效果 移动端网页布局&#xff1a; 除…

工作需要,JAVAer自学python

人生苦短&#xff0c;我用Python。 是如何学习/自学 Python 的&#xff1f; 我学习python的方式其实很简单很暴力&#xff1a;网上直接搜视频教程&#xff1b; 我之前一直做java的&#xff0c;学习python其实也是一个机缘巧合&#xff1a;当时入职一个朋友刚好有python岗位&a…

初识Unity——基本模型、场景操作、世界坐标系和局部坐标系

目录 基本模型 创建基本模型 基本模型的复制 复杂模型 场景操作 聚焦 旋转 移动 场景视野 世界坐标系 基本介绍 原点 局部坐标系 基本模型 创建基本模型 基本模型的复制 创建基本模型之后&#xff0c;会在我们视野中心生成这个模型&#xff1b;当我们需要复…

SpringAOP简介及实现(包含切面、切点、连接点和通知)

目录 1.什么是AOP、SpringAOP&#xff1f; 2.AOP的组成 3.SpringAOP的实现 4.切点的表达式 1.什么是AOP、SpringAOP&#xff1f; 在学习SpringAOP之前&#xff0c;我们得先了解一下什么是AOP。AOP是一种面向切面编程的思想。那什么是切面呢&#xff1f;它其实是对某一类事情…

软件外包开发代码管理工具

软件代码规范是为了提高代码质量、可读性和可维护性而制定的一系列编程规则和约定。代码管理工具则是用于协助团队成员共享、跟踪和合并代码的工具。今天和大家分享这方面的知识&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&a…

定制底部footer bug:切换tab时position fixed会抖动

文章目录 bug描述position:fixed是啥&#xff1f;有啥用为什么切换tab的时候会抖动如何解决自定义一个InBody组件&#xff0c;将里面所有的元素放到body里面需要放到的底部的内容都放到这个组件里面 bug描述 在element admin里面定制了footer组件&#xff0c;每个页面也可还有…

离散数学_十章-图 ( 3 ):由旧图构造新图

&#x1f4f7;10.3 由旧图构造新图 概念1. 子图2. 真子图3. 导出的子图 旧图构造新图的方法1. 删除或增加图中的边2. 边的收缩3. 删除顶点 有时解决问题只需要图的一部分。 比如我们现在只关心大型计算机网络中涉及济南&#xff0c;广州&#xff0c;深圳的计算机中心&#xff0…

学习c语言中的几道习题(小有难度)!

有兴趣的朋友可以看着题目自己做做&#xff0c;最后在和答案对比&#xff01;相信能力会有所提升的。我现在只是刚刚开始学习c语言&#xff0c;如果有什么说的不对的地方&#xff0c;网路过的大佬&#xff0c;及时予以指正。多谢&#xff01; 1、函数判断闰年 实现函数判断yea…

chatgpt赋能python:Python行太长如何处理?

Python行太长如何处理&#xff1f; 介绍 Python 是一门强大的编程语言&#xff0c;易于学习和使用。它也因其可读性和简洁性而受到广泛赞誉。然而&#xff0c;在实际编写时&#xff0c;往往遇到了行太长的情况。 当一行代码在编辑器中撑满了整个屏幕&#xff0c;或者末尾的字…

【Redis入门篇】| Redis的Java客户端

目录 一&#xff1a; Redis的Java客户端 1. Jedis快速入门 2. Jedis连接池 3. SpringDataRedis快速入门 4. RedisSerializer配置 5. StringRedisTemplate 图书推荐 一&#xff1a; Redis的Java客户端 在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;…

chatgpt赋能python:Python阶乘算法——快速、高效的算法实现!

Python阶乘算法 —— 快速、高效的算法实现&#xff01; Python作为一门高级编程语言&#xff0c;在众多领域都得到了广泛应用&#xff0c;尤其在算法领域更是拥有着举足轻重的地位。阶乘算法作为计算领域中的一种经典算法&#xff0c;也是Python中不可或缺的一部分。 什么是…

尚硅谷大数据hadoop教程_HDFS

P40 hdfs产生背景和定义 p41 优缺点 p42 组成 p43 文件块大小 p 44 45 shell命令 p46 api环境准备

单链表—C语言实现数据结构

本期带大家一起用C语言实现单链表&#x1f308;&#x1f308;&#x1f308; 文章目录 一、链表的概念&#x1f30e;二、链表中数据元素的构成&#x1f30e; &#x1f30d;三、链表的结构&#x1f30e; &#x1f30d; &#x1f30f;四、 单链表的实现✅✅二、接口的实现✅✅1.单…

SAP-MM-采购申请-价值特性

采购申请审批在维护价值特性时要注意是抬头价值还是行价值&#xff0c;要确定选择哪个&#xff0c;配置时对应配置。 1、创建价值特性CT04 字段名称&#xff1a;CEBAN-GSWRT&#xff0c;和CEBAN-GFWRT 抬头总价值&#xff1a;CEBAN-GFWRT&#xff1b;如果选择的是抬头审批&am…