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.hqwc.cn/news/340340.html

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

相关文章

Win系统搭建Elasticsearch实现公网远程访问本地服务

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎&#xff0c;它提供了一个分布式、多…

docker/华为云cce 部署nacos 2.3.0 集群模式

镜像地址 https://hub.docker.com/r/nacos/nacos-server 版本 nacos/nacos-server:v2.3.0-slim 关键环境变量 使用mysql数据源 变量值备注MODEcluster启用集群模式MYSQL_SERVICE_DB_NAME数据库名MYSQL_SERVICE_USER数据库用户名MYSQL_SERVICE_PASSWORD数据库密码SPRING_D…

static

static static是表示静态&#xff0c;是java里面的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量 静态变量 被static修饰的变量&#xff0c;叫静态变量&#xff0c; 特点&#xff1a; 1.被该类所有的对象共享 &#xff0c; 2.不属于对象&#xff0c;属于类 3…

freeRTOS总结(五)临界段代码保护

1&#xff0c;临界段代码保护简介 1、1什么是临界段 临界段代码也叫做临界区&#xff0c;是指那些必须完整运行&#xff0c;不能被打断的代码段 1.2适用场合如 1、外设初始化:需严格按照时序初始化的外设&#xff1a;IIC、SPI等等 2&#xff0c;系统 系统自身需求 3、用户…

C++学习笔记(三十二):c++ 堆内存与栈内存比较

本节对堆和栈内存进行描述。 应用程序启动后&#xff0c;操作系统将整个程序加载到内存&#xff0c;分配相应的物理ram&#xff0c;确保程序可以正常运行。堆和栈是ram中存在的两个区域。栈通常是一个预定义大小的内存区域&#xff0c;一般是2M字节左右。堆也是预定了默认值的…

如果你还忍受校园网,那么一定要看它!随身WiFi哪个品牌最靠谱 ?高人气随身WiFi第一名

很多学生党反映校园网价格太贵&#xff0c;贵就算了&#xff0c;还非常不好用&#xff0c;真的很泪崩。 对于学生党来说&#xff0c;一个性价比极高的随身WiFi才是正正好。 但是很多学生党对随身WiFi并不了解&#xff0c;那么下面我就回答几个学生党最关心的问题。一、价格合…

AI系统ChatGPT网站系统源码AI绘画详细搭建部署教程,支持GPT语音对话+DALL-E3文生图+GPT-4多模态模型识图理解

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

SpringBoot-开启Admin监控服务

SpringBoot-Admin是一个用于管理和监控SpringBoot应用程序的开源项目。它提供了一个易于使用的Web界面&#xff0c;可以实时监控应用程序的健康状况、性能指标、日志和环境配置等信息。通过Actuator模块来收集和暴露应用程序的监控信息&#xff0c;使用Web Socket或者Server-Se…

Go语言学习笔记(三)

教程&#xff1a;文档 - Go 编程语言 (studygolang.com) 调用模块代码 在call-module-code需要注意&#xff0c;需要在hello目录下操作 go mod edit -replace example.com/greetings../greetings 这是一个在Go项目的模块管理中的命令。在Go的模块管理工具&#xff08;go mod&…

【Python机器学习】决策树集成——梯度提升回归树

理论知识&#xff1a; 梯度提升回归树通过合并多个决策树来构建一个更为强大的模型。虽然名字里有“回归”&#xff0c;但这个模型既能用于回归&#xff0c;也能用于分类。与随机森林方法不同&#xff0c;梯度提升采用连续的方式构造树&#xff0c;每棵树都试图纠正前一…

Unity组件开发--AB包打包工具

1.项目工程路径下创建文件夹&#xff1a;ABundles 2.AB包打包脚本&#xff1a; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement;public class AssetBundle…

建造者模式深入理解:演示建造单个和多个产品的实践,结合模板模式;支持并行构建,通俗易懂

首先呢看下建造者的定义是什么样的&#xff0c;先读一遍 建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它主要用于将一个复杂对象的构建过程与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表现形式。这种模式…