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

【JAVA】Netty使用教程

目录

一、Netty概述

二、Netty的核心组件

2.1 Channel(通道)

2.2 EventLoop(事件循环)

2.3 ByteBuf(字节缓冲区)

2.4 Handler(处理器)

2.5 Pipeline(流水线)

三、Netty的基本使用

3.1 添加Netty依赖

3.2 创建EventLoopGroup

3.3 创建ServerBootstrap实例

3.4 配置Channel和Handler

3.5 绑定端口并启动服务器

3.6 编写Handler

3.7 Netty的异步回调模式

3.8 Netty的Reactor反应器模式

3.9 Netty的编解码器

四、Netty编程实例

4.1 处理客户端连接

4.2 数据读写

4.3 关闭连接

五、Netty的高级特性

5.1 零拷贝(Zero-Copy)

5.2 内存管理

5.3 流量控制

5.4 安全性

5.5 协议扩展

六、Netty的实际应用场景

6.1 RPC框架

6.2 游戏服务器 

6.3 实时消息推送系统 

6.4 分布式系统 

6.5 HTTP服务器

七、总结与进阶


        Netty是一个由JBOSS提供,现为Github上的独立项目的Java开源框架。它是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络IO程序。以下是Netty的使用教程:

一、Netty概述

Netty本质是一个NIO框架,适用于服务器通讯相关的多种应用场景。它主要针对TCP协议下的高并发应用,或者Peer to Peer场景下的大量数据持续传输的应用。Netty提供了易于使用的API,通过封装Java NIO的复杂性,让网络编程变得更加简单和高效。

二、Netty的核心组件

2.1 Channel(通道)

        网络操作的基本载体,类似于Java NIO中的Socket,但Netty的Channel是双向的,可以进行读和写操作。

        Netty提供了一系列的Channel实现,如NioSocketChannel、NioServerSocketChannel等,用于支持不同的通信协议。

2.2 EventLoop(事件循环)

        处理所有Channel上的事件的线程,负责接收和发送数据、处理连接等。

        Netty中的EventLoop可以绑定多个Channel,从而有效地管理多个连接。

2.3 ByteBuf(字节缓冲区)

        Netty提供的高效且易用的字节容器,与JDK的ByteBuffer不同,ByteBuf支持更灵活的动态缓冲区,提供了更多的操作接口。

2.4 Handler(处理器)

        Netty中的关键组件,用于处理入站和出站数据、触发事件以及实现业务逻辑。

        Netty提供了多种类型的Handler,如ChannelHandler、ChannelInitializer等,开发者可以根据需要选择或自定义Handler。

2.5 Pipeline(流水线)

        Netty中的Pipeline是一个Handler链,它将一系列的Handler顺序连接起来,用于处理通过Channel传输的数据。

        开发者可以将自定义的Handler添加到Pipeline中,以实现特定的业务逻辑。

三、Netty的基本使用

3.1 添加Netty依赖

   - 在项目的pom.xml文件中添加Netty的依赖项,以引入Netty库。

<dependencies>
    <!-- 添加Netty依赖 -->
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.69.Final</version> <!-- 请使用最新的稳定版本 -->
    </dependency>
</dependencies>

3.2 创建EventLoopGroup

        EventLoopGroup是Netty中用于处理IO操作的多线程事件循环器。在服务器端,通常需要创建两个EventLoopGroup:一个用于接收客户端连接(bossGroup),另一个用于处理网络IO操作(workerGroup)。

EventLoopGroup group = new NioEventLoopGroup();

3.3 创建ServerBootstrap实例

        ServerBootstrap是Netty用于启动服务器的辅助类,它提供了配置服务器启动参数的方法。

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
 
public class NettyServer {
 
    private int port;
 
    public NettyServer(int port) {
        this.port = port;
    }
 
    public void start() throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap(); // (2)
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class) // (3)
             .childHandler(new ChannelInitializer<SocketChannel>() { // (4)
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     // 添加处理器或其他配置
                 }
             });
 
            // 绑定端口,开始接收连接
            ChannelFuture f = b.bind(port).sync(); // (5)
 
            // 等待服务器套接字关闭
            f.channel().closeFuture().sync();
        } finally {
            // 释放资源
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
 
    public static void main(String[] args) throws Exception {
        int port;
        if (args.length > 0) {
            port = Integer.parseInt(args[0]);
        } else {
            port = 8080;
        }
        new NettyServer(port).start();
    }
}

        这段代码展示了如何创建一个基本的Netty服务器。首先,我们创建了两个EventLoopGroup实例,一个用于parent(acceptor)线程,另一个用于child(I/O)线程。然后,我们创建了一个ServerBootstrap实例,配置了线程组和服务器套接字通道类型,并设置了一个ChannelInitializer来初始化新接收的连接的通道。最后,我们绑定服务器到指定端口并开始接收连接。

3.4 配置Channel和Handler

   通过ServerBootstrap的channel()方法设置服务器的Channel类型(如NioServerSocketChannel)。

        通过childHandler()方法设置用于处理客户端请求的Handler。

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
 
public class NettyServer {
 
    private int port;
 
    public NettyServer(int port) {
        this.port = port;
    }
 
    public void start() throws Exception {
        // 配置服务端的NIO线程组
        // 用于处理网络事件的线程分为两种:
        // boss线

http://www.kler.cn/a/533205.html

相关文章:

  • pytorch使用SVM实现文本分类
  • 84-《金银花》
  • 线性调整器——耗能型调整器
  • vim-plug的自动安装与基本使用介绍
  • React+Cesium基础教程(003):加载3D建筑物和创建标签
  • Java:日期时间范围的处理
  • Java 报错:找不到或无法加载主类
  • Maven 项目的基本结构
  • 我们来学人工智能 -- 感悟DeepSeek
  • Llama最新开源大模型Llama3.1
  • Java之线程篇六
  • 关于论文复现的环境配置以及其他的坑点
  • 自研有限元软件与ANSYS精度对比-Bar3D2Node三维杆单元模型-央视大裤衩实例
  • Vue3 完整学习笔记 - 第三部分
  • 【Spring】Spring Cloud Alibaba 版本选择及项目搭建笔记
  • 剑指offer 二叉树 持续更新中...
  • FastPlanner论文解读(一)——前端路径搜索
  • 「全网最细 + 实战源码案例」设计模式——模板方法模式
  • JavaScript语言的面向对象编程
  • 代码随想录算法训练营Day36
  • 深入理解 Rust 模块中的路径与公开性:绝对路径、相对路径和 `pub` 的应用
  • mysql 学习8 函数,字符串函数,数值函数,日期函数,流程函数
  • 18.[前端开发]Day18-王者荣耀项目实战(一)
  • Scheme语言的正则表达式
  • 传输层协议——TCP协议
  • LeetCode 0922.按奇偶排序数组 II:O(1)空间复杂度-一次遍历双指针