Netty02-入门

2023-11-02

二. Netty 入门

1. 概述

1.1 Netty 是什么?

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

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端

1.2 Netty 的作者

他还是另一个著名网络应用框架 Mina 的重要贡献者

1.3 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 - 分布式协调框架

1.4 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 已废弃(没有明显的性能提升,维护成本高)

2. Hello World

2.1 目标

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

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

加入依赖

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

2.2 服务器端

new ServerBootstrap()
    .group(new NioEventLoopGroup()) // 1
    .channel(NioServerSocketChannel.class) // 2
    .childHandler(new ChannelInitializer<NioSocketChannel>() { // 3
        protected void initChannel(NioSocketChannel ch) {
            ch.pipeline().addLast(new StringDecoder()); // 5
            ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() { // 6
                @Override
                protected void channelRead0(ChannelHandlerContext ctx, String msg) {
                    System.out.println(msg);
                }
            });
        }
    })
    .bind(8080); // 4

代码解读

  • 1 处,创建 NioEventLoopGroup,可以简单理解为 线程池 + Selector 后面会详细展开

  • 2 处,选择服务 Scoket 实现类,其中 NioServerSocketChannel 表示基于 NIO 的服务器端实现,其它实现还有

  • 3 处,为啥方法叫 childHandler,是接下来添加的处理器都是给 SocketChannel 用的,而不是给 ServerSocketChannel。ChannelInitializer 处理器(仅执行一次),它的作用是待客户端 SocketChannel 建立连接后,执行 initChannel 以便添加更多的处理器

  • 4 处,ServerSocketChannel 绑定的监听端口

  • 5 处,SocketChannel 的处理器,解码 ByteBuf => String

  • 6 处,SocketChannel 的业务处理器,使用上一个处理器的处理结果

2.3 客户端

new Bootstrap()
    .group(new NioEventLoopGroup()) // 1
    .channel(NioSocketChannel.class) // 2
    .handler(new ChannelInitializer<Channel>() { // 3
        @Override
        protected void initChannel(Channel ch) {
            ch.pipeline().addLast(new StringEncoder()); // 8
        }
    })
    .connect("127.0.0.1", 8080) // 4
    .sync() // 5
    .channel() // 6
    .writeAndFlush(new Date() + ": hello world!"); // 7

代码解读

  • 1 处,创建 NioEventLoopGroup,同 Server

  • 2 处,选择客户 Socket 实现类,NioSocketChannel 表示基于 NIO 的客户端实现,其它实现还有

  • 3 处,添加 SocketChannel 的处理器,ChannelInitializer 处理器(仅执行一次),它的作用是待客户端 SocketChannel 建立连接后,执行 initChannel 以便添加更多的处理器

  • 4 处,指定要连接的服务器和端口

  • 5 处,Netty 中很多方法都是异步的,如 connect,这时需要使用 sync 方法等待 connect 建立连接完毕

  • 6 处,获取 channel 对象,它即为通道抽象,可以进行数据读写操作

  • 7 处,写入消息并清空缓冲区

  • 8 处,消息会经过通道 handler 处理,这里是将 String => ByteBuf 发出

  • 数据经过网络传输,到达服务器端,服务器端 5 和 6 处的 handler 先后被触发,走完一个流程

2.4 流程梳理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Netty02-入门 的相关文章

  • Micronaut ReadTimeoutException 异常

    我有一个提供 REST API 的 Grails 4 应用程序 端点之一有时会失败 但会出现以下异常 io micronaut http client exceptions ReadTimeoutException Read Timeout
  • 有人可以更好地解释解码器/编码器吗?

    修改后的问题 好的 所以我正在尝试将其合并到我自己的定制游戏中 我了解了Netty服务器和客户端如何连接的过程 我还了解解码器和编码器在理论上是如何工作的 但这是我仍然想了解的 我的服务器进程 Server boots up gt Clie
  • netty源码:(28)ChannelPromise

    ChannelPromise是ChannelFuture的子接口 它是可写入的 其父接口Promise定义如下 ChannelPromise有个默认的实现类 DefaultChannelPromise 它的setSuccess方法用来调用所
  • 从 netty ByteBuf 获取字符串

    如何从netty中获取字符串ByteBuf 到目前为止 我能够逐个字符地获取它 有没有办法直接获取字符串对象 message is of type ByteBuf for int i 0 i lt message capacity i by
  • 以编程方式关闭 netty

    我正在使用 netty 4 0 24 Final 我需要以编程方式启动 停止 netty 服务器 启动服务器时 线程被阻塞在 f channel closeFuture sync 请帮助提供一些如何正确执行的提示 下面是 Main 类调用的
  • 在 netty 通道上设置套接字超时

    我有一个 netty 通道 我想在底层套接字上设置超时 默认设置为 0 超时的目的是 如果 15 分钟内没有发生任何事情 则未使用的通道将被关闭 虽然我没有看到任何配置可以这样做 而且套接字本身也对我隐藏 Thanks 如果使用ReadTi
  • 使用 Netty 的 UDP 服务器中丢失大量 UDP 请求

    我用 Netty 编写了一个简单的 UDP 服务器 它只是在日志中打印出收到的消息 帧 为此 我创建了一个简单的帧解码器解码器和一个简单的消息处理程序 我还有一个可以顺序和 或并行发送多个请求的客户端 当我配置我的客户端测试器以顺序发送数百
  • 使用 grpc 和 protobuf Hello world 示例面对 io.netty.util.AttributeKey.valueOf() 方法的 NoSuchMethodError

    运行 GreetingServerTest java 测试后 我收到以下给定的错误 我正在使用 grpc 1 1 0 SNAPSHOT 库并尝试实现 git repo 中给出的 grpc 的基本 Helloword 示例 任何人都可以建议我
  • 监控 Netty 事件循环队列的大小

    我们已经实现了对 Netty 事件循环队列的监控 以便了解一些 Netty 模块的问题 该显示器使用io netty util concurrent SingleThreadEventExecutor pendingTasks方法 适用于大
  • JBoss Netty 与 JSON

    我希望我的 Ajax 代码能够通过 Netty 连接服务器 为此 我需要在服务器端 Netty 处理程序中使用 JSON 解码器和编码器 是否有任何开箱即用的实现 或者我应该编写自己的实现 Thanks Gil 据我所知 没有内置的 JSO
  • 无法加载库:[netty_tcnative_linux_arm_32、netty_tcnative_linux_arm_32_fedora、netty_tcnative_arm_32、netty_tcnative]

    我正在尝试在 raspberry pi modal 3 上使用 jar 运行 java 应用程序 我无法解决此问题 有人可以建议我如何在树莓派上进行这项工作吗 在 pom 中 我包含了 google cloud speech 依赖项 0 5
  • ChannelOption.SO_BACKLOG 的作用是什么?

    option ChannelOption SO BACKLOG 100 Netty 4 升级文档中显示 你能解释一下它的作用吗 Thanks 它是一个传递的套接字选项 用于确定排队的连接数 http docs oracle com java
  • 使用 Netty 的异步 HTTP 客户端

    我是 Netty 新手 仍在努力寻找自己的方法 我正在寻找创建一个异步工作的 http 客户端 http的netty例子只展示了如何等待IO操作 并没有展示如何使用添加监听器 所以最近几天我一直在努力解决这个问题 我正在尝试创建一个请求类
  • 如何知道Netty ByteBuf中是否没有数据可读取?

    我是 Netty 新手 文件传输的问题让我困惑了好几天 我想发送image文件从客户端到服务器 下面的代码是可执行的 但只有我shutdown服务器强制我可以正常打开收到的图像文件 否则 显示 您似乎没有查看此文件的权限 检查权限并重试 所
  • Netty websocket客户端闲置5分钟后不从服务器读取新帧

    我在服务器端和客户端都使用 Netty 来建立和控制 websocket 连接 我在服务器端有一个空闲状态处理程序 http netty io 4 1 api io netty handler timeout IdleStateHandle
  • Netty 和字节顺序

    由于文档不完善并且缺乏 Netty 经验 我遇到了一些问题 我不知道如何设置默认的 ByteOrder 我需要一个小尾数法默认设置 如果有人能给我一些关于这方面的提示 我会很高兴 你可以使用Bootstrap setOption 去做这个
  • Java 互操作——Netty + Clojure

    我正在尝试通过 clojure 使用 netty 我可以启动服务器 但是它无法初始化接受的套接字 下面分别是错误消息和代码 有谁知道什么是 或可能是错误的 我相信问题在于 Channels pipeline server handler T
  • 为什么我们真的需要多个 Netty boss 线程?

    我真的很困惑老板组的线程数量 我无法弄清楚我们需要多个老板线程的场景 在Boss 组是否需要多个线程 https stackoverflow com questions 22280916 do we need more than a sin
  • Netty:正确关闭 WebSocket

    如何从服务器端正确关闭 WebSocket 通道 连接 如果我使用一个ctx getChannel close the onerror在浏览器 Firefox 9 中抛出 页面加载时与 ws localhost 8080 websocket
  • 如何查找以下 netty 错误的根本原因:io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s)

    我经历过从负责将数据发送到 TCP 客户端的管道引发的以下异常 2017 03 02T18 00 53 749 epollEventLoopGroup 3 1 ERROR ExceptionHandler null Unknown exce

随机推荐

  • 图遍历

    第七章 图 7 14 Status Build AdjList ALGraph G 输入有向图的顶点数 边数 顶点信息和边的信息建立邻接表 InitALGraph G scanf d v if v lt 0 return ERROR 顶点数
  • 产生死锁的四个必要条件

    1 互斥条件 一个资源每次只能被一个进程使用 2 请求与保持条件 一个进程因请求资源而阻塞时 对已获得资源保持不放 3 不剥夺条件 进程已获得的资源 在未使用完之前 不能强行剥夺 4 循环等待条件 若干进程之间形成一种头尾相接的循环等待资源
  • [Linux用户空间编程-5]:用IPTable实现NAT功能

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123427800 目录 前言 第1章
  • 5个高清视频素材网站,免费商用,建议收藏~

    1 Mixkit https mixkit co 站内有非常多的高清视频素材 音频素材 视频全部都分类好了 像自然 航拍 科技 人物等等这里都能找到 还有很多视频模板 达芬奇模板全部都是免费 可商用 但每天有限制下载次数 素材的授权方式也不
  • 2022春招前端最新面试题分享(诺亚财富)

    诺亚财富面经 公司及岗位信息 公司 诺亚财富 岗位 前端开发工程师 地点 上海 薪资 10k 15k 14薪 面试结果 三轮技术面全部通过 约了HR面了 一面 2022 04 21 自我介绍 为什么不在实习公司转正 JS常见数据类型 基本类
  • windows Ubuntu loongnix 网络通信

    当我们进行Linux应用开发时 我们面临的首要问题便是如何让windows ubuntu和开发板三者完成通信 以便于代码文件的传输 1 windows和ubuntu 的通信 首先我们在建立ubuntu虚拟机时将其网络适配器模式配置为NAT
  • To create POPUP menu

    To create popupmenu Create new menu as follows Select popup opion Click on define transfer Assign any menu component pag
  • 飞猪单品详情采集

    api detail f ret SUCCESS 调用成功 v 1 0 data sold data sold 月销 5647 笔 soldCount 5647 tag sold pageContainer children detailC
  • python(chapter02)

    字符串 字符串 pystr python iscool is cool print pystr 0 使用切片法来进行字符串的切割 索引是2 到 5 的字符串 print pystr 2 5 索引是0到2的 print iscool 2 索引
  • ChatGLM-6B的安装和使用最全面细节讲解

    ChatGLM 6B是一个基于General Language Model GLM 架构的开源对话语言模型 支持中英双语 该模型使用了和ChatGPT类似的技术进行优化 经过1T标识符的中英双语训练 同时辅以监督微调 反馈自助和人类反馈强化
  • 【Solidity】Storage和memory关键字的区别和用法

    在 Solidity 中 有两个地方可以存储变量 storage以及memory Storage 变量是指永久存储在区块链中的变量 Memory 变量则是临时的 当外部函数对某合约调用完成时 内存型变量即被移除 状态变量 在函数之外声明的变
  • Work Tips

    目录 IAR环境下 使用Live Watch实时监控变量值 IAR替换mcu库 Linux中删除swp文件 使用J Link通过SWD接口直接下载 hex文件和 bin文件到MCU 下载J Flash软件 linux设置时间命令 Jlink
  • chatgpt综述和报告

    ChatGPT究竟强在哪 复旦大学邱锡鹏教授 大型语言模型的能力分析与应用 哔哩哔哩 bilibili2022年底 美国OpenA1公司发布了ChatGPT 一个可以与人类对话交互的千亿规模参数的大型语言模型 它可以根据用户输入的指令完成各
  • Cocos Creator 华容道

    环境 cocos creator 2 0 10 Mac环境 TypeScript 文末附源码链接 本文提供了游戏玩法的逻辑 支持关卡配置 可以自由配置关卡 先看一下效果 首先 我们看一下我们要处理的问题 1 区域划分 2 角色摆放 即 关卡
  • openWRT添加模块(四)

    http blog chinaunix net uid 10429687 id 3374873 html OpenWrt是一个比较完善的嵌入式Linux开发平台 在无线路由器应用上已有100多个软件包 人们可以在其基础上增加软件包 以扩大其
  • PID怎么应用到实际控制系统

    早就想写篇PID应用的文章 可是一直以来受限于自己的知识水平和能力 未能如愿 整个暑假在做一个激光电源的控制程序 核心思想又是PID控制 看来在整个控制领域 PID 的市场可是无处不在啊 关于PID的理论分析这里不在赘述 可以在一般的资料上
  • 判断这个数能被4整除,但是不能被100整除

    需求 用户输入一个 判断这个数能被4整除 但是不能被100整除 分析 1 用户输入 2 控制台 是否能被4整除并且100整除 let num prompt 请输入一个数 num num 0 防止用户输入空字符若是空字符就为0 let re
  • kdj超卖_kdj超卖是什么意思?kdj超买超卖区别是什么

    kdj超卖是什么意思 kdj超买超卖区别是什么 对于大多数股民来说 指标应用是股市投资必不可少的操作系统 指标的主要作用就是用来作参考 辅助自己进行股票投资 今天 在这里我们所要谈论的是kdj指标 kdj超卖是什么意思 如何判断kdj超买超
  • angular4学习指南,环境搭建,基础概念解析(一)

    一 Angular是什么 Angular是由google开发维护的一个开发跨平台应用的框架 同时适应PC端和移动端 两个大版本 1 5 和4 0 4 0完全重写 1 5之前的叫angularJS 4 0叫angular 二 Angular开
  • Netty02-入门

    二 Netty 入门 1 概述 1 1 Netty 是什么 Netty is an asynchronous event driven network application framework for rapid development