当前位置: 首页 > news >正文

Netty入门使用

为什么会有Netty?

NIO 的类库和 API 繁杂,使用起来比较麻烦,需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。开发工作量和难度都非常大,例如客户端面临断线重连、网络闪断、心跳处理、半包读写、网络拥塞和异常流的处理等。Netty 对 JDK 自带的 NIO 的 API 进行了良好的封装,解决了上述问题。此外,Netty 拥有高性能、吞吐量更高,延迟更低,减少资源消耗,最小化不必要的内存复制等优点。目前使用的是 Netty 4.x 版本,5.x 版本已经废弃,Netty 4.x 需要 JDK 6 以上版本支持.

Netty示例

引入maven依赖

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

服务端代码

public static void main(String[] args) throws Exception{// 创建两个线程组bossGroup和workerGroupNioEventLoopGroup bossGroup = new NioEventLoopGroup();NioEventLoopGroup workerGroup = new NioEventLoopGroup();try {// 创建服务器端的启动对象ServerBootstrap bootstrap = new ServerBootstrap();// 使用链式编程来配置参数bootstrap.group(bossGroup,workerGroup) // 设置两个线程组.channel(NioServerSocketChannel.class) // 使用NioServerSocketChannel作为服务器的通道实现.option(ChannelOption.SO_BACKLOG,1024) // 初始化服务器连接队列大小.childHandler(new ChannelInitializer<SocketChannel>() { // 创建通道初始化对象,设置初始化参数@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {// 对workerGroup的SocketChannel设置处理器socketChannel.pipeline().addLast(new NettyServerHandler());}});System.out.println("Netty server start...");// 绑定一个端口并且同步ChannelFuture cf = bootstrap.bind(9999).sync();// 通过sync方法同步等待通道关闭处理完毕,这里会阻塞等待通道关闭完成cf.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}// 服务端处理器
public class NettyClientHandler extends ChannelInboundHandlerAdapter {/*** 客户端连接服务端后触发*/@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {ByteBuf buf = Unpooled.copiedBuffer("Hello Netty Server", CharsetUtil.UTF_8);ctx.writeAndFlush(buf);}/*** 读取服务端发送的数据*/@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf buf = (ByteBuf) msg;System.out.println("收到服务端发送的数据:"+buf.toString(CharsetUtil.UTF_8));System.out.println("服务端地址:"+ctx.channel().remoteAddress());}/*** 异常关闭*/@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {ctx.close();}
}// 启动Server服务端 -> 输出
Netty server start...

客户端代码

 public static void main(String[] args) throws Exception{// 客户端事件循环组NioEventLoopGroup group = new NioEventLoopGroup();try {// 客户端启动对象Bootstrap bootstrap = new Bootstrap();// 设置相关参数bootstrap.group(group) // 设置线程组.channel(NioSocketChannel.class) // 使用NioSocketChannel作为客户端的通道实现.handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {// 加入处理器socketChannel.pipeline().addLast(new NettyClientHandler());}});System.out.println("Netty client start");// 启动客户端去连接服务器端ChannelFuture channelFuture = bootstrap.connect("localhost", 9999).sync();// 对关闭通道进行监听channelFuture.channel().closeFuture().sync();} finally {group.shutdownGracefully();}}// 处理器public class NettyClientHandler extends ChannelInboundHandlerAdapter {/*** 客户端连接服务端后触发*/@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {ByteBuf buf = Unpooled.copiedBuffer("Hello Netty Server", CharsetUtil.UTF_8);ctx.writeAndFlush(buf);}/*** 读取服务端发送的数据*/@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf buf = (ByteBuf) msg;System.out.println("收到服务端发送的数据:"+buf.toString(CharsetUtil.UTF_8));System.out.println("服务端地址:"+ctx.channel().remoteAddress());}/*** 异常关闭*/@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {ctx.close();}
}
// 启动客户端 -> 输出
Netty client start
收到服务端发送的数据:ACK
服务端地址:localhost/127.0.0.1:9999
// 服务端 -> 输出
服务器读取线程:nioEventLoopGroup-3-1
客户端发送的消息是:Hello Netty Server

Netty应用场景

1)在互联网行业的分布式系统中,各个节点需要进行远程服务调用,因此需要高性能的RPC框架。Netty作为异步高性能的通信框架,通常作为这些 RPC 框架的基础通信组件。
例如阿里分布式服务框架 Dubbo 使用 Dubbo 协议进行节点间通信,而 Dubbo 协议默认采用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。此外,Rocketmq 的底层也使用 Netty 作为基础通信组件。2)在游戏行业不论是手游服务端还是大型网络游戏,Java 语言的应用越来越广泛。
Netty 作为高性能的基础通信组件,提供了 TCP/UDPHTTP 协议栈。3)在大数据领域,经典的 Hadoop 的高性能通信和序列化组件 AvroRPC 框架,默认采用 Netty 进行跨界点通信。
它Netty Service 基于 Netty 框架进行二次封装实现。

相关文章:

Netty入门使用

为什么会有Netty? NIO 的类库和 API 繁杂&#xff0c;使用起来比较麻烦&#xff0c;需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。开发工作量和难度都非常大&#xff0c;例如客户端面临断线重连、网络闪断、心跳处理、半包读写、网络拥塞和异…...

go并发编程-runtime、Channel与Goroutine

1. runtime包 1.1.1. runtime.Gosched() 让出CPU时间片&#xff0c;重新等待安排任务(大概意思就是本来计划的好好的周末出去烧烤&#xff0c;但是你妈让你去相亲,两种情况第一就是你相亲速度非常快&#xff0c;见面就黄不耽误你继续烧烤&#xff0c;第二种情况就是你相亲速度…...

HTTP概述

HTTP概述 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于传输超文本的应用层协议。它是在客户端和服务器之间进行通信的基础&#xff0c;常用于 Web 应用中。在 Java 后端开发中&#xff0c;HTTP 扮演着重要的角色。以下是Java 后端视角下的 HTTP 概述&a…...

ubuntu20配置mysql8

首先更新软件包索引运行 sudo apt update命令。然后运行 sudo apt install mysql-server安装MySQL服务器。 安装完成后&#xff0c;MySQL服务将作为systemd服务自动启动。你可以运行 sudo systemctl status mysql命令验证MySQL服务器是否正在运行。 连接MySQL 当MySQL安装…...

CPU-Cache结构查看

参考【Ubuntu 查看 CPU 缓存】 本文主要介绍cpu的cache查看&#xff0c;以供读者能够理解该技术的定义、原理、应用。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;计算机杂记 &#x1f380;CSDN主页 发狂的小花…...

Wireshark网络协议分析 - Wireshark速览

在我的博客阅读本文 文章目录 1. 版本与平台2. 快速上手2.1. 选择网络接口进行捕获&#xff08;Capture&#xff09;2.2. 以Ping命令为例进行抓包分析2.3. 设置合适的过滤表达式2.4. 数据包详情2.5. TCP/IP 四层模型 3. 参考资料 1. 版本与平台 Wireshark是一个开源的网络数据…...

查看进程创建的所有线程

ps 在ps命令中&#xff0c;“-T”选项可以开启线程查看。下面的命令列出了由进程号为的进程创建的所有线程。 ps -T -p <pid>top op命令可以实时显示各个线程情况。要在top输出中开启线程查看&#xff0c;请调用top命令的“-H”选项&#xff0c;该选项会列出所有Linux…...

汽车软件开发模式的5个特点

汽车软件开发属于较为复杂的系统工程&#xff0c;经常让来自不同知识背景的工程师在观点交锋时出现分歧。在解决复杂性和对齐讨论基准时&#xff0c;可以通过勾勒出讨论对象最关键的几个特征来树立典型概念。本文旨在通过5个典型特点的抽取&#xff0c;来勾勒出汽车软件开发模式…...

双屏联动系统在展厅设计中的互动类型与效果

随着各项多媒体技术的快速发展&#xff0c;让展厅中的各类展项得到技术升级&#xff0c;其中作为电子设备中最基础的显示技术&#xff0c;不仅优化了内容的展示质量&#xff0c;还实现了更具互动性的创新技术&#xff0c;如双屏联动系统就是当前展厅设计中最常见的技术类型之一…...

STM32F407移植OpenHarmony笔记5

继上一篇笔记&#xff0c;搭建好STM32的编译框架&#xff0c;编译出来的OHOS_Image.bin并不能跑不起来。 今天要在bsp里面添加一些代码&#xff0c;让程序能跑起来。 先从裸机点亮LED灯开始&#xff0c;准备以下3个文件:startup和system文件可以用OHOS官方代码。 /device/boar…...

点击其他区域隐藏弹出框效果

一般下拉框或者选择框&#xff0c;持久展示时会给用户显示的隐藏方式&#xff0c;如点击事件后。也可以添加隐式的隐藏方式&#xff0c;如点击弹出框之外的区域。 CSS方法-focus伪类 当触发的元素是可以focus&#xff0c;以输入框为例。 可以将弹出框出现的时机设置在input:…...

Python一些可能用的到的函数系列123 ATimer2-时间偏移

说明 之前确定了时间轴&#xff08;千年历&#xff09;&#xff0c;以及时间的转换方法。其中时间轴的数据将会存储在集群&#xff0c;以及通过RedisOrMongo保存部分常用的数据。 本次讨论时间偏移的度量问题。 内容 1 两种形式 我们提到时间时&#xff0c;通常会有两种方…...

企业微信主体变更 怎么操作?

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…...

《区块链简易速速上手小册》第8章:区块链的技术挑战(2024 最新版)

文章目录 8.1 可扩展性问题8.1.1 基础知识8.1.2 主要案例&#xff1a;比特币的可扩展性挑战8.1.3 拓展案例 1&#xff1a;以太坊的可扩展性改进8.1.4 拓展案例 2&#xff1a;侧链和分层解决方案 8.2 安全性与隐私8.2.1 基础知识8.2.2 主要案例&#xff1a;比特币交易的安全性8.…...

基于STM32的云上OneNET智慧大棚(包含程序设计报告)

目录 概要 作品介绍 设计原理 设计作品结构 软件部分 概要 为了解决传统农业生产效率低下&#xff0c;消耗大量的人力物力&#xff0c;不能精确的对农作物实现监控的问题&#xff0c;从而最大限度的提高农业生产力&#xff0c;实现优质、高产、低耗、环保的可持续发展物联…...

11.scala函数进阶

目录 概述函数scala函数和方法的区别第一种第二种方法转函数 函数柯里化 结束 概述 函数 vs 方法 1.定义 方法&#xff1a;def函数&#xff1a;> 2.方法本质上是一个特殊的函数3.函数是一等公民&#xff0c;函数可以当做值来传递&#xff0c;方法的参数&#xff0c;返回值…...

在WebSocket中使用Redis出现空指针异常解决方案

文章目录 在WebSocket中使用Redis1.问题描述2.原因3.解决步骤1.新建一个SpringUtil.java类&#xff0c;通过getBean的方法主动获取实例2.在WebSocketSingleServer.java中导入 在WebSocket中使用Redis 1.问题描述 在controller 和 service中都可以正常使用Redis&#xff0c;在…...

问题:第十三届全国人民代表大会第四次会议召开的时间是()。 #经验分享#知识分享#媒体

问题&#xff1a;第十三届全国人民代表大会第四次会议召开的时间是&#xff08;&#xff09;。 A. 2018年3月3日至3月11日 B. 2019年3月5日至3月11日 C. 2020年3月5日至3月11日 D. 2021年3月5日至3月11日 参考答案如图所示 问题&#xff1a;顾客满意是顾客对一件产品满足…...

《区块链简易速速上手小册》第10章:区块链的未来与趋势(2024 最新版)

文章目录 10.1 区块链的未来展望10.1.1 基础知识10.1.2 主要案例&#xff1a;区块链在金融领域的发展10.1.3 拓展案例 1&#xff1a;区块链在供应链管理中的应用10.1.4 拓展案例 2&#xff1a;区块链在身份管理和隐私保护中的应用 10.2 新兴技术与区块链的融合10.2.1 基础知识1…...

JVM工作原理与实战(三十一):诊断内存泄漏的原因

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、诊断原因 二、MAT内存泄漏检测的原理 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码&#xff0c;管理内存&#xff0c;确保安全&#xff0c;支持多线…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...