Java的Netty

在这里插入图片描述

1.基本概念介绍

有了Netty,你可以实现自己的HTTP服务器,FTP服务器,UDP服务器,RPC服务器,WebSocket服务器,Redis的Proxy服务器,MySQL的Proxy服务器等等。

Netty 是一个基于 Java 的高性能网络应用框架,用于快速开发可扩展的网络服务器和客户端。它提供了强大的异步、事件驱动的网络编程能力,并且使用简单、灵活。

以下是 Netty 的一些关键特性和组件:

  1. 异步和事件驱动:Netty 使用事件驱动的方式,采用异步的 I/O 模型,能够处理大量的并发连接,避免阻塞和资源浪费。

  2. Channel 和 ChannelHandler:Netty 使用 Channel 来表示网络连接,通过 ChannelHandler 处理传入或传出的数据事件,提供了灵活的数据处理机制。

  3. ByteBuf:Netty 中的 ByteBuf 是对字节数据的抽象,提供了高效、灵活的字节缓冲区管理。

  4. Codec 和编解码器支持:Netty 提供了丰富的编解码器,用于处理常见的协议(如 HTTP、WebSocket、SSL/TLS等),简化了数据编解码的操作。

  5. 高性能和可扩展性:Netty 的设计考虑了性能和可扩展性,通过优化的 NIO 组件以及灵活的架构,使其适用于构建高性能的网络应用。

  6. TCP/UDP 支持:Netty 可以用于构建基于 TCP 和 UDP 的网络应用,支持多种网络协议的处理。

  7. 安全性:Netty 提供了对 SSL/TLS 的支持,可以用于构建安全的网络通信。

  8. 各种工具类和辅助组件:Netty 提供了许多辅助类和工具,用于简化网络编程中的常见任务,例如处理事件循环、管理线程池等。

通过这些特性,Netty 成为了构建高性能、可靠性网络应用的强大框架,常用于构建服务器、实时通信系统、分布式系统等场景。它的灵活性和高度定制化使得开发人员可以根据不同的需求定制自己的网络应用程序。

1.1. Netty的优点

概括一下就是:

  1. 使用简单;
  2. 功能强大;
  3. 性能强悍。

1.2. Netty的特点:

  1. 高并发:基于 NIO(Nonblocking IO,非阻塞IO)开发,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高;
  2. 传输快:传输依赖于零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输;
  3. 封装好:封装了 NIO 操作的很多细节,提供了易于使用调用接口。

1.3. Netty的优势:

  1. 使用简单:封装了 NIO 的很多细节,使用更简单;
  2. 功能强大:预置了多种编解码功能,支持多种主流协议;
  3. 扩展性强:可以通过 ChannelHandler 对通信框架进行灵活地扩展;
  4. 性能优异:通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优;
  5. 运行稳定:Netty 修复了已经发现的所有 NIO 的 bug,让开发人员可以专注于业务本身;
  6. 社区活跃:Netty 是活跃的开源项目,版本迭代周期短,bug 修复速度快。

1.4. Netty高性能表现在哪些方面?

  1. IO 线程模型:同步非阻塞,用最少的资源做更多的事;
  2. 内存零拷贝:尽量减少不必要的内存拷贝,实现了更高效率的传输;
  3. 内存池设计:申请的内存可以重用,主要指直接内存。内部实现是用一颗二叉查找树管理内存分配情况;
  4. 串形化处理读写:避免使用锁带来的性能开销;
  5. 高性能序列化协议:支持 protobuf 等高性能序列化协议。

2.具体应用案例

Netty 可以用于构建各种类型的高性能网络应用,以下是一些具体的应用案例:

  1. 实时通信系统:Netty 在实时通信领域应用广泛,如聊天服务器、即时消息传递系统,支持高并发和低延迟的实时通信。

  2. 网络游戏服务器:许多在线游戏使用 Netty 构建其游戏服务器,能够处理大量并发玩家连接,并提供稳定、高性能的游戏体验。

  3. 金融行业:在金融领域,高性能和可靠性至关重要。Netty 被用于构建高速交易系统、支付处理系统等,以保证数据传输的实时性和可靠性。

  4. 物联网(IoT)应用:Netty 可用于构建物联网设备之间的通信,实现设备管理、数据传输等功能,支持大规模设备连接。

  5. 服务器端推送(Server Push)应用:例如实时数据推送、股票市场行情推送等,利用 Netty 的高效性能和低延迟特性,能够快速有效地推送数据给客户端。

  6. 代理服务器:构建代理服务器,例如 HTTP 代理、SOCKS 代理等,实现网络流量转发、过滤和修改等功能。

  7. 分布式系统:Netty 可以作为底层通信框架,用于构建分布式系统中的节点间通信,支持快速、可靠的数据传输。

  8. 流媒体处理:Netty 在流媒体领域也有应用,用于构建流媒体服务器,支持实时音视频流的传输与处理。

这些应用案例只是 Netty 的部分应用领域示例,实际上,由于其灵活性和高性能,它可以应用于更多不同类型的网络应用场景。根据具体的需求和业务场景,Netty 提供了丰富的功能和组件,能够满足各种复杂的网络通信需求。

3.具体案例代码

3.1.实时通信系统

3.1.1. Server端代码

package org.example.server;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;public class SimpleChatServer {private static final int PORT = 8080;public static void main(String[] args) {EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new SimpleChatServerInitializer());ChannelFuture channelFuture = serverBootstrap.bind(PORT).sync();System.out.println("Chat Server started on port " + PORT);channelFuture.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}
package org.example.server;import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;public class SimpleChatServerHandler extends SimpleChannelInboundHandler<String> {private static final ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);@Overridepublic void handlerAdded(ChannelHandlerContext ctx) {Channel incoming = ctx.channel();channels.writeAndFlush("[SERVER] - " + incoming.remoteAddress() + " has joined\n");channels.add(incoming);}@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) {Channel incoming = ctx.channel();channels.writeAndFlush("[SERVER] - " + incoming.remoteAddress() + " has left\n");channels.remove(incoming);}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {Channel incoming = ctx.channel();System.out.println(msg);for (Channel channel : channels) {if (channel != incoming) {channel.writeAndFlush("[" + incoming.remoteAddress() + "] " + msg + "\n");}}}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();}
}
package org.example.server;import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;public class SimpleChatServerInitializer extends ChannelInitializer<SocketChannel> {@Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new LineBasedFrameDecoder(1024)); // 根据换行符解码消息pipeline.addLast(new StringDecoder(), new StringEncoder());pipeline.addLast(new SimpleChatServerHandler());}
}

3.1.2.Client端代码

package org.example.client;import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;import java.io.BufferedReader;
import java.io.InputStreamReader;public class SimpleChatClient {public static void main(String[] args) {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(group).channel(NioSocketChannel.class).handler(new SimpleChatClientInitializer());Channel channel = bootstrap.connect("127.0.0.1", 8080).sync().channel();BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));while (true) {channel.writeAndFlush(reader.readLine() + "\n");}} catch (Exception e) {e.printStackTrace();} finally {group.shutdownGracefully();}}
}
package org.example.client;import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;public class SimpleChatClientHandler extends SimpleChannelInboundHandler<String> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {System.out.println(msg);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();}
}
package org.example.client;import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;public class SimpleChatClientInitializer extends ChannelInitializer<SocketChannel> {@Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new LineBasedFrameDecoder(1024));pipeline.addLast(new StringDecoder(), new StringEncoder());pipeline.addLast(new SimpleChatClientHandler());}
}

3.1.3. Maven

pom.xml

    <dependencies><!-- Netty Dependency --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.66.Final</version> <!-- 使用你想要的 Netty 版本 --></dependency></dependencies>

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

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

相关文章

红队打靶练习:BREACH: 1

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.110.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.110.1 00:50:56:c0:00:08 …

RK3568驱动指南|第十篇 热插拔-第118章 使用udev挂载U盘和T卡实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

CTF-PWN-沙箱逃脱-【seccomp和prtcl-1】

文章目录 啥是seccomp#ifndef #define #endif使用使用格式 seccomp无参数条件禁用系统调用有参数条件禁用系统调用 prctl实例 seccomp_export_bpf 啥是seccomp 就是可以禁用掉某些系统调用&#xff0c;然后只能允许某些系统调用 #ifndef #define #endif使用 #ifndef #defin…

Day4Qt

1.头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime>//时间类 #include <QTimer>//时间事件类 #include <QTimerEvent>//定时器类 #include <QTextToSpeech> namespace Ui { class Widget; }class Widget : publi…

JMeter 批量接口测试

一、背景 最近在进行某中台的接口测试准备&#xff0c;发现接口数量非常多&#xff0c;有6、70个&#xff0c;而且每个接口都有大量的参数并且需要进行各种参数验证来测试接口是否能够正确返回响应值。想了几种方案后&#xff0c;决定尝试使用JMeter的csv读取来实现批量的接口…

vscode 创建文件自动添加注释信息

随机记录 目录 1. 背景介绍 2. "Docstring Generator"扩展 2.1 安装 2.2 设置注释信息 3. 自动配置py 文件头注释 1. 背景介绍 在VS Code中&#xff0c;您可以使用扩展来为新创建的Python文件自动添加头部注释信息。有几个常用的扩展可以实现此功能&#xff0…

Vue3:使用解构赋值来读取对象里的键-值对(值也是对象)

一、前言 在Vue3中&#xff0c;想要读取一个对象的“键—值”对&#xff08;值也是一个对象&#xff09;&#xff0c;数据格式如下&#xff1a; {1:{courseName: 课程1, study: 951526, visit: 3785553}&#xff0c;2:{courseName: 课程2, study: 181630, visit: 380830}&…

springboot+ipage分页频繁请求会报错 自动添加多一个limit

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near LIMIT 500 at line 3 这个原因是因为springboot配置mysql的连接池太…

nginx sendfile

http模块中有一个sendfile指令&#xff0c;默认开启的 简单来说就是启用sendfile()系统调用来替换read()和write()调用&#xff0c;减少系统上下文切换从而提高性能&#xff0c; 当 nginx 是静态文件服务器时&#xff0c;能极大提高nginx的性能表现&#xff0c; 而当 nginx 是…

在线问卷调查的优势:提升数据收集与分析效率的关键要素

无论是在工作中还是学习中&#xff0c;我们经常会使用问卷调查法来解决一些问题。不过&#xff0c;问卷调查有两种形式——线上和线下&#xff0c;这两者之间有什么优势和不足呢&#xff1f; 纸质问卷&#xff1a; 1、优势&#xff1a; 我们在使用纸质问卷的时候&#xff0c;通…

十年磨一剑,写在美国比特币现货ETF获批后

出品&#xff5c;欧科云链研究院 作者&#xff5c;Hedy Bi 两天前&#xff0c;我们提出&#xff0c;对于比特币现货ETF市场。十年磨一剑&#xff0c;今天&#xff0c;这一里程碑终于到来。美国证监会&#xff08;SEC&#xff09;批准了11只比特币现货ETF&#xff0c;将会在芝…

【计算机网络】TCP原理 | 可靠性机制分析(三)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程、计算机网络的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

气温如同过山车?探索气候变化对肠道微生物组的影响

谷禾健康 今年的天气&#xff0c;如此的奇怪&#xff1a; 短袖和羽绒服之间&#xff0c;只差了一个降温 忽冷忽热&#xff0c;气温仿佛过山车... 11月初多地气温破纪录&#xff0c;冬天集体迟到... 早穿皮袄午穿纱&#xff0c;每天不知道穿啥... 再不冷都不好意思过圣诞了... 好…

XCTF:CatCatCat[WriteUP]

从题目中下载到一张图片和一个txt文件 编码的开头是&#xff1a;U2FsdGVkX1所以是rabbit加密 尝试使用密钥&#xff1a;91 密码不对&#xff0c;无法解密所以从图片下手 使用010Editor搜索图片文本内容 尝试搜索password、flag等敏感字体 直接拿到rabbit解密需要的密钥是&am…

软件测试|Python中如何控制输出小数点位数

简介 在数据处理、科学计算和金融分析等领域&#xff0c;经常需要对浮点数的输出进行格式化&#xff0c;以控制小数点后的位数。Python提供了多种方法来实现这个目标。在本文中&#xff0c;我们将深入探讨几种指定输出小数点位数的方法&#xff0c;帮助我们在不同场景下选择合…

大模型实战笔记04——XTuner 大模型单卡低成本微调实战

大模型实战笔记04——XTuner 大模型单卡低成本微调实战 1、Finetune简介 2、XTuner 3、8GB显存玩转LLM 4、动手实战环节 注&#xff1a; 笔记内容均为截图 课程视频地址&#xff1a;https://www.bilibili.com/video/BV1yK4y1B75J/?spm_id_from333.788&vd_source2882acf…

RT-Thread:STM32实时时钟 RTC开启及应用

说明&#xff1a;STM32F103/407系列基于 RT-Thread 系统的 RTC 开启及应用 应用流程介绍。 1. RTC功能开启 1.1 开启系统RTC驱动 1.2 打开系统RTC相关的宏 1.3 打开库函数 RTC 相关的宏 完成以上系统配置&#xff0c;编译无误情况下RTC 就已经开启了。 2. RTC 应用 官方 AP…

Java项目:117SpringBoot动漫论坛网站

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 117SpringBoot动漫论坛网站 一、项目介绍 动漫论坛网站是由SpringBootMybatis开发的&#xff0c;旅游网站分为前台和后台&#xff0c;前台为用户浏览&#xff0c;后台进…

关于java的稀疏数组

关于java的稀疏数组 我们在前面的文章中了解了冒泡排序和优化冒泡排序&#xff0c;在本篇文章中我们来介绍一下稀疏数组&#xff0c;我们学会了可以自己动手试一试&#x1f600; 稀疏数组 在介绍稀疏数组之前&#xff0c;我们先来了解一下五子棋。 我们这里有一个11 x 11的棋…

虚拟机Linux硬盘扩容

扩容前(20G)&#xff1a; 扩容后(60G)&#xff1a; 步骤&#xff1a; 1. 点击 虚拟机 -> 设置 -> 硬件 -> 硬盘(SCSI) -> 扩展(E)... -> 输入想要扩容大大小 -> 扩展(E) 2. 运行虚拟机&#xff0c;查看根目录属于那个文件系统&#xff0c;我的是 /dev/sda1…