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

Netty入门详解

引言

Netty 是一个基于 Java 的高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能网络服务器和客户端。它提供了一组丰富的 API,使得开发人员能够轻松地处理各种网络协议,如 TCP、UDP 等,并且支持多种编解码方式,方便与不同的应用层协议进行对接。本篇文章将详细阐述Netty的核心概念帮助我们快速理解

 Netty 的核心概念

  • Channel:Netty 中所有的 I/O 操作都发生在Channel上,它代表了一个到实体(如硬件设备、文件、网络套接字等)的开放连接,能够执行读、写、连接、绑定等操作。
  • EventLoopEventLoop是 Netty 中处理事件的核心组件,它负责处理Channel上的所有事件,包括连接、读、写等操作。每个EventLoop会不断循环,处理注册到它上面的Channel的各种事件。
  • ChannelHandlerChannelHandler是 Netty 中处理 I/O 事件的主要方式,它可以对Channel上的事件进行拦截、处理和转换。开发人员可以自定义ChannelHandler来实现自己的业务逻辑,比如对消息的编解码、对业务请求的处理等。
  • ChannelPipelineChannelPipeline是一个由ChannelHandler组成的链,它负责管理和执行Channel上的ChannelHandler。当Channel上有事件发生时,ChannelPipeline会按照顺序依次调用链中的ChannelHandler来处理事件。

Netty 的依赖

在 Maven 项目中,添加 Netty 的依赖:

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

版本可以自己选定这是比较稳定的版本

netty-all包含所有组件可以根据自己需要细分依赖

Netty 的工作原理

  • Reactor 模型:Netty 基于 Reactor 模型实现了高性能的网络通信。它通过一个或多个EventLoop线程来监听Channel上的事件,当有事件发生时,将事件分发给对应的ChannelHandler进行处理。
  • 异步非阻塞 I/O:Netty 使用 Java 的异步非阻塞 I/O(NIO)技术来实现高效的网络通信。在异步非阻塞模式下,I/O 操作不会阻塞线程,而是通过回调函数或 Future 来通知操作的结果,这样可以大大提高系统的并发处理能力。

实战实现Netty服务器 

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
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 {

    public static void main(String[] args) throws Exception {
        // 用于接收客户端连接的线程组
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        // 用于处理客户端连接后读写操作的线程组
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            // 创建ServerBootstrap实例
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
            .channel(NioServerSocketChannel.class)
            .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 protected void initChannel(SocketChannel ch) throws Exception {
                     // 这里可以添加自定义的ChannelHandler
                 }
             })
            .option(ChannelOption.SO_BACKLOG, 128)
            .childOption(ChannelOption.SO_KEEPALIVE, true);

            // 绑定端口,开始监听
            ChannelFuture f = b.bind(8888).sync();

            // 等待服务器监听端口关闭
            f.channel().closeFuture().sync();
        } finally {
            // 关闭线程组
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
}

上述代码创建了一个简单的 Netty 服务端,它监听在 8888 端口上,当有客户端连接时,可以在initChannel方法中添加自定义的ChannelHandler来处理客户端的请求。

Netty 的应用场景

  • 网络通信框架:Netty 可以作为基础的网络通信框架,用于开发各种网络应用,如 HTTP 服务器、FTP 服务器、RPC 框架等。
  • 游戏服务器:在游戏开发中,Netty 可以用于开发游戏服务器,处理玩家的连接、消息收发等操作,能够满足游戏对高性能、高并发的要求。
  • 分布式系统:在分布式系统中,Netty 可以用于节点之间的通信,实现数据的传输和交互。

相关文章:

  • halcon机器视觉深度学习对象检测,物体检测
  • 自学FOC系列分享--SVPWM和clark 逆变换及代码实战
  • docker从容器中cp到本地、cp本地到容器
  • LabVIEW开发中的电机控制与相机像素差
  • Visual Studio中打开多个项目
  • 【微中子代理踩坑-前端node-sass安装失败】
  • 敏捷开发07:敏捷项目可视化管理-ScrumBoard(Scrum板)使用介绍
  • rust 实例化动态对象
  • IC卡、M1卡及各类卡的原理使用说明
  • 以太网的MAC(介质访问控制)详解
  • 前端知识点---vue的声明周期(vue)
  • RAGFLOW使用flask转发的open ai接口
  • C# 十六进制字符串转换为十进制
  • Error [ERR_REQUIRE_ESM]: require() of ES Module
  • 深入了解 DevOps 基础架构:可追溯性的关键作用
  • 深入理解 C++17 中的 std::atomic<T>::is_always_lock_free
  • 全面了解 Stanford NLP:强大自然语言处理工具的使用与案例
  • 在mfc中使用自定义三维向量类和计算多个三维向量的平均值
  • Alluxio Enterprise AI 3.5 发布,全面提升AI模型训练性能
  • UE 学习记录
  • 四川一国企“80后”掌门人为报领导“知遇之恩”,盲目决策致数亿损失
  • 魔都眼丨人形机器人“华山论剑”:拳击赛缺席,足球赛抢镜
  • 上海未来亚洲研究会第六届会员大会举行,叶青当选会长
  • 美联储褐皮书:关税政策背景下,美国部分地区物价上涨、经济前景恶化
  • 西安市优化营商环境投诉举报监督平台上线,鼓励实名检举控告
  • 刺激视网膜可让人“看”到全新颜色