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

Netty

netty

[Netty实践] 简单聊天实现(一):基础部分_netty 聊天-CSDN博客

Netty 是一个基于 Java 的异步事件驱动的网络应用框架,专门用于开发高性能、可扩展的网络应用。它抽象了 Java 的网络编程接口,简化了 NIO(非阻塞 I/O)的复杂操作,并为用户提供了简便、灵活的编程模型。Netty 主要用于构建客户端-服务器架构中的通信应用,特别是在高并发和低延迟要求的场景中表现优异。

Netty 的关键特点

  1. 高性能:Netty 基于 Java NIO,支持异步和非阻塞 I/O,可以处理大量并发连接,适合高并发场景。
  2. 跨平台:支持多种传输协议和平台,既可以构建 TCP/IP、UDP 协议应用,也支持 HTTP、WebSocket 等高级协议。
  3. 事件驱动模型:采用事件驱动(Event-Driven)的编程模型,网络操作和数据处理通过事件的触发和回调来处理,降低了代码复杂度。
  4. 易于扩展:Netty 提供了一个灵活的管道(Pipeline)机制,可以将数据的编码、解码、压缩等操作按照需求自由组合,便于扩展和自定义。
  5. 可靠性:它提供了丰富的错误处理机制,确保了高可用性,同时其成熟的社区和广泛使用也保证了其稳定性。

Netty 的主要组件

  1. Channel:表示一个开放的连接,可以读写数据,是网络操作的核心。Netty 中有多种类型的 Channel,如 NioSocketChannel、NioServerSocketChannel 等,分别对应不同的传输模式(客户端、服务器)。

  2. EventLoop:负责处理 I/O 操作和事件分发。每个 Channel 都会绑定一个 EventLoop,EventLoop 中的线程会不断轮询事件,并触发对应的事件处理器。

  3. ChannelFuture:表示异步操作的结果。由于 Netty 是异步的,当执行一个 I/O 操作时,操作会立即返回一个 ChannelFuture,应用程序可以通过这个 Future 得知操作的成功或失败。

  4. ChannelHandler:负责处理 Channel 中的数据,可以是编码、解码、数据读取、写入或其他逻辑操作。多个 Handler 可以组成一个处理链,用于完成复杂的数据处理。

  5. Pipeline:每个 Channel 都有一个 Pipeline,用于管理 ChannelHandler 的链。数据会按顺序经过这些 Handler 进行处理。通过 Pipeline,可以灵活地添加或删除 Handler 来实现数据的流动处理。

Netty 的工作流程

Netty 的运行机制可以简单分为以下几个步骤:

  1. 启动服务器或客户端:服务器会通过绑定端口监听客户端的连接,客户端则需要指定服务器地址和端口发起连接。

  2. 连接建立:当客户端与服务器建立连接时,Netty 会创建一个对应的 Channel 实例,随后数据会通过该 Channel 传递。

  3. 数据处理:当有数据传输时,数据会经过 Channel 的 Pipeline 传递到相应的 ChannelHandler 进行处理。通常,数据会在经过一系列的编解码后,变成适合业务逻辑处理的对象。

  4. 事件回调:Netty 通过事件驱动机制,如连接建立事件、读写事件等,触发相应的 ChannelHandler 处理具体的业务逻辑。

  5. 关闭连接:当通信完成或出现异常时,Netty 会关闭连接并释放资源。

Netty 的应用场景

  1. 高并发服务器:Netty 被广泛用于构建高性能的服务器应用,如 Web 服务器、文件服务器、游戏服务器等,尤其适合需要处理大量并发连接的场景。

  2. 微服务通信:Netty 可以用于微服务架构中的服务间通信,支持高效的点对点传输。

  3. 网络协议实现:Netty 提供了对多种网络协议(如 TCP、UDP、HTTP、WebSocket 等)的支持,开发者可以方便地扩展 Netty 来实现自定义协议。

  4. 代理服务器:Netty 也适合用作反向代理、网关等需要高吞吐量和低延迟的场景。

    public class NettyServer {
        public static void main(String[] args) throws Exception {
            EventLoopGroup bossGroup = new NioEventLoopGroup(1);
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            try {
                ServerBootstrap serverBootstrap = new ServerBootstrap();
                serverBootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new SimpleServerHandler());
                        }
                    });
    
                // 绑定端口启动服务器
                ChannelFuture channelFuture = serverBootstrap.bind(8080).sync();
                // 关闭服务器
                channelFuture.channel().closeFuture().sync();
            } finally {
                bossGroup.shutdownGracefully();
                workerGroup.shutdownGracefully();
            }
        }
    }
    
    class SimpleServerHandler extends ChannelInboundHandlerAdapter {
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            ByteBuf in = (ByteBuf) msg;
            System.out.println("收到消息: " + in.toString(CharsetUtil.UTF_8));
            ctx.writeAndFlush(Unpooled.copiedBuffer("消息已收到", CharsetUtil.UTF_8));
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            cause.printStackTrace();
            ctx.close();
        }
    }
    

    这个例子创建了一个简单的 TCP 服务器,它会监听 8080 端口,当接收到客户端消息时,会回复一条消息。

  5. 结果:运行上述 Netty 服务器代码后,程序会启动一个 TCP 服务器并监听端口 8080。当客户端连接到该服务器并发送一条消息时,服务器会收到并打印该消息,然后向客户端回复 "消息已收到"。在程序关闭之前,服务器会一直运行并等待新的客户端连接。

  6. 运行步骤及结果:

  7. 服务器启动

    • 运行后,服务器会监听 8080 端口,准备接收客户端连接。
    • 控制台没有输出,但服务器已经处于监听状态。
  8. 客户端连接和发送消息

    • 可以通过任意 TCP 客户端工具(如 telnet 或编写一个简单的客户端程序)连接到服务器并发送消息。例如,可以使用命令行工具 telnet 连接到服务器:

      telnet localhost 8080

    • 连接成功后,输入一条消息并发送,例如 "Hello, Netty!"。
  9. 服务器的处理

    • 服务器会接收客户端的消息,并在控制台输出:

      收到消息: Hello, Netty!

    • 然后服务器会向客户端发送回复 "消息已收到"。
  10. 客户端接收到服务器的回复

    • 客户端会显示从服务器返回的消息:

      消息已收到

  11. 服务器的持续运行

    • 服务器会继续等待其他客户端的连接,直到手动关闭程序为止。

http://www.kler.cn/news/355932.html

相关文章:

  • MatrixOne助力江铜集团打造炉前智慧作业AIoT大数据系统
  • 分布式介绍
  • 框架一 Mybatis Spring SpringMVC(东西居多 后边的没怎么处理)
  • 05 django管理系统 - 部门管理 - 修改部门
  • Linux :at crontab简述
  • 【论文解读系列】EdgeNAT: 高效边缘检测的 Transformer
  • 猫鼠游戏: KaijiK病毒入侵溯源分析
  • (一)Java1.8核心包rt.jar——java.lang.annotation
  • Web APIs - 第2天笔记(黑马笔记)
  • MySQL的事务处理Savepoint,commit
  • 管家婆工贸ERP BB081.订单收付款功能
  • 【Vue】--项目文件结构
  • 线性可分支持向量机的原理推导 转为拉格朗日函数式 公式解析
  • 以太坊的未来面临挑战:Covalent Network(CXT)的 EWM 轻客户端提供解决方案
  • 大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置
  • C# -- Abstract、Virtual、interface
  • c++ 使用 Jarvis 算法或包装的凸包(Convex Hull using Jarvis’ Algorithm or Wrapping)
  • 问:JVM中的垃圾器,有哪些?
  • 嵌入式入门学习——7Protues导入Arduino IDE生成的固件和Arduino使用库文件开发
  • 大数据-177 Elasticsearch Query DSL - 聚合分析 指标聚合 桶聚合