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 可以用于节点之间的通信,实现数据的传输和交互。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】优先级队列宝藏岛

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…

【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进

文章目录 一. 什么是分布式事务&#xff1f;二. 分布式事务的挑战三. 事务的ACID特性四. CAP理论与BASE理论1. CAP理论1.1. 三大特性1.2. 三者不能兼得 2. BASE理论 五. 分布式事务解决方案1. 两阶段提交&#xff08;2PC&#xff09;2. TCC&#xff08;Try-Confirm-Cancel&…

Linux-C/C++《C++/1、C++基础》(C++语言特性、面向对象等)

这里主要介绍概念为主&#xff0c;主要介绍 C与 C 语言中常用的不同点&#xff0c;和一些新的变化。其中不会去说指针、数据类型、变量类型、判断和循环等这些知识&#xff0c;这些和C 语言基本是一样使用的。我们主要学习 C的面向对象编程&#xff0c;对学习 Qt 有很大的帮助。…

我国首条大型无人机城际低空物流航线成功首航

首航震撼开场&#xff1a;羊肉 “飞” 越 540 公里 在夜色的笼罩下&#xff0c;榆阳马合通用机场的跑道上&#xff0c;一架大型固定翼无人机蓄势待发&#xff0c;机身被灯光照亮&#xff0c;宛如一只即将展翅翱翔的钢铁巨鸟。它的货舱里&#xff0c;满满装载着新鲜的榆林羊肉&a…

python-leetcode 38.翻转二叉树

题目&#xff1a; 给定一个二叉树的根节点root,检查它是否轴对称。 方法一&#xff1a;递归 如果一个树的左子树与右子树镜像对称&#xff0c;那么这个树是对称的。 互为镜像的条件&#xff1a;他们的两个根结点具有相同的值&#xff0c;每棵树的右子树都与另一个树的左子树…

锐浪报表 Grid++Report 通用软件,通用模板个性打印

为提高软件打印报表的适应性&#xff0c;再软件中&#xff0c;使用统一的模板&#xff0c;实现个性化的调整。实现不同用的需求&#xff0c;本人作了以下尝试&#xff1a; 一、表头的选择 二、明细表格的高度的调整 // 明细表标题行高GridppReport_7.DetailGrid.ColumnTitle.H…

Plant Simulation培训教程-AGV配送物流仿真模块

原创 知行 天理智能科技 2024年12月31日 07:00 浙江 又到年终盘点的时候了&#xff0c;在这里我把之前录制的Plant Simulation培训教程-AGV配送物流仿真模块分享出来&#xff0c;有需要的可以直接联系我。 模型路径通过Marker点搭建&#xff0c;适用于磁条导航、二维码导航等…

【Python 专题】数据结构 树

LeetCode 题目104. 二叉树的最大深度(gif 图解)方法一:后序遍历(DFS)方法二:层序遍历(BFS)872. 叶子相似的树(DFS 遍历)1448. 统计二叉树中好节点的数目(DFS 遍历)437. 路径总和 III(前缀和 + DFS 回溯)1372. 二叉树中的最长交错路径(DFS)236. 二叉树的最近公共…

基于射频开关选择的VNA校准设计

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

关于协同显著性物体检测的思考

摘要 问题一&#xff1a;什么叫做CoEG-Net框架&#xff1f; CoEG-Net 是一种用于图像分割或其他计算机视觉任务的深度学习框架&#xff0c;具体来说&#xff0c;它主要关注边缘感知和图像细节恢复。CoEG-Net 的全称是 Contextual Edge Guidance Network&#xff0c;其主要创新…

排查JVM的一些命令

查看JVM相关信息的方法 环境&#xff1a; Win10, jdk17 查看端口的Pid netstat -ano | findstr <端口号>列出当前运行的JVM进程 ## 用于输出JVM中运行的进程状态信息。通过jps&#xff0c;可以快速获取Java进程的PID&#xff08;进程标识符&#xff09;&#xff0c; …

【AI应用】Cherry Studio结合deepseek搭建本地知识库

硅基流动注册 前往 硅基官网 &#xff08;https://cloud.siliconflow.cn/i/JUwuNCzb&#xff09;链接带了我的推荐码&#xff0c;注册成功后&#xff0c;您将获得 14R&#xff08;2000W Token&#xff09;&#xff0c;用于配置 Embedding&#xff08;嵌入式模型&#xff09; 新…

第1章大型互联网公司的基础架构——1.11 消息中间件技术

消息队列&#xff08;Message Queue&#xff09;是分布式系统中最重要的中间件之一&#xff0c;在服务架构设计中被广泛使用。 1.11.1 通信模式与用途 消息中间件构建了这样的通信模式&#xff1a; 一条消息由生产者创建&#xff0c;并被投递到存放消息的队列中&#xff1b;…

windows解压多个文件夹内的zip文件脚本

情景引入 不知道大家是否有一个疑问&#xff0c;如果下载到的源码文件是很多个目录&#xff0c;目录里面的项目都是压缩的&#xff0c;那我们该怎么办&#xff1f; 目录结构 目录结构如下 Test ├── 1 │ └── 1.zip └── 2 └── 2.zip 执行脚本 先cd到Test下&am…

文件和目录的操作-8

文章目录 1.IO流2.文件流操作with语句3.文件和文件夹的操作4.案例1.IO流 通过“流”的形式允许计算机程序使用相同的方式来访问不同的输入/输出源。stream是从源(source)到接收目标的(sink)有序数据。如果把输入/输出源比作“水桶”,那流就是“管道” 文件流:就是源或者…

EasyRTC:轻量化SDK赋能嵌入式设备,开启智能硬件音视频通讯新篇章

在智能硬件与物联网飞速发展的今天&#xff0c;嵌入式设备的音视频通讯能力正变得愈发重要。然而&#xff0c;受限于硬件资源&#xff0c;尤其是Flash存储空间的不足&#xff0c;传统音视频通讯方案往往难以在嵌入式设备上实现高效集成。EasyRTC凭借其轻量级SDK和先进的技术架构…

处理哈希冲突

有时候哈希表⽆论选择什么哈希函数都⽆法避免冲突&#xff0c;那么插⼊数据时&#xff0c;如何解决冲突呢&#xff1f;主要两种⽅法&#xff0c;线性探测法和链地址法&#xff0c;这篇先做原理描述&#xff0c;下篇实现代码模拟 一、线性探测 发生冲突的位置开始&#xff0c;依…

安装MySQL9.1.0-winx64.msi的报错解决办法:Database initialization failed。(也适用9.2.0)

csdn上有很多关于安装MySQL9.1.0-winx64.msi的报错&#xff08;Database initialization failed&#xff09;的解决办法&#xff0c;根据报错log便签内容总结一下有以下几种&#xff1a; 1、电脑名称有中文的&#xff0c;参考这篇&#xff1a; 【MySQL】Windows上安装MySQL时…

聊一聊vue如何实现角色权限的控制的

大家好&#xff0c;我是G探险者。 关于角色与权限控制&#xff0c;通常是分为两大类&#xff1a;一种是菜单权限&#xff1b;一种是操作权限。 菜单权限是指&#xff0c;每个角色对应着可以看到哪些菜单&#xff0c;至于每个菜单里面的每个按钮&#xff0c;比如增删改查等等这类…

使用 OpenTelemetry 和 Langtrace 的 Elastic 分发跟踪基于 RAG 的聊天机器人

作者&#xff1a;来自 Elastic Bahubali Shetti 如何使用 Elastic 观察基于 OpenAI RAG 的应用程序。使用 Langtrace 对应用程序进行检测&#xff0c;收集日志、跟踪、指标&#xff0c;并了解 LLM 在 Kubernetes 上使用 OpenTelemetry 的 Elastic Distributions 的运行情况。 目…