Netty权威指南_netty编程实战

Netty权威指南_netty编程实战2.1BIO采用BIO通信模型的服务器,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行处理,处理完成后,通过输出流返回应答给客户端,线程销毁。graphTDA1[Client]–>|读/写|B(Acceptor线程)A2[Client]–>|读/写|BA3[Client]–>|读…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

2.1 BIO

采用 BIO 通信模型的服务器,通常由一个独立的 Acceptor 线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行处理,处理完成后,通过输出流返回应答给客户端,线程销毁。

graph TD

A1[Client] –>|读/写| B(Acceptor 线程)

A2[Client] –>|读/写| B

A3[Client] –>|读/写| B

B –>|创建| C1[Thread]

B –>|创建| C2[Thread]

B –>|创建| C3[Thread]

2.2 伪异步 I/O

采用 线程池 和 任务队列 可以实现一种叫做 伪异步 I/O 通信框架。 当有新的客户端接入时,将客户端的 Socket 封装成一个 Task 投递到后端的线程池中进行处理,JDK 的线程池维护着一个消息队列和 N 个活跃线程,对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此它的资源占用时可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。

graph TD

A1[Client] –>|读/写| B(Acceptor 线程)

A2[Client] –>|读/写| B

A3[Client] –>|读/写| B

B –> |提交 Task|P[Thread Pool]

B –> |提交 Task|P

B –> |提交 Task|P

2.3 NIO

NIO 官方称为 New I/O,目标是要让 Java 支持非阻塞 I/O,所以通常也叫非阻塞 I/O(Non-blocking I/O)。

阻塞模式使用非常简单,但是性能和可靠性都不好,非阻塞模式则正好相反。一般来说,低负载、低并发的应用程序可以选择同步阻塞 I/O 以降低编程复杂度;对于高负载、高并发的网络应用,需要使用 NIO 的非阻塞模式进行开发。

graph TD

C1[Client] –> |读/写| S[Selector]

C2[Client] –> |读/写| S

C3[Client] –> |读/写| S

S –> P[Thread]

2.3.1 Buffer、Channel、Selector

1. 缓冲区 Buffer

Buffer 是一个对象,它包含一些要写入或者要读出的数据。在 NIO 库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接从缓冲区读取;在写入数据时,写入到缓冲区。

fb0e045a19fd738c64f6db0d0b2fc672.png

public abstract class Buffer {

// Invariants: mark <= position <= limit <= capacity

private int mark = -1;

private int position = 0;

private int limit;

private int capacity;

}

2. 通道 Channel

网络数据通过 Channel 读取和写入。通道与流的不同之处在于通道是双向的,流只是在一个方向移动,而通道可用于读、写或者二者同时进行。

因为 Channel 是全双工的,所以它可以比流更好地映射底层操作系统的 API。

d626e18ebdd6d7572228f6ff3bd598e8.png

3. 多路复用器 Selector

多路复用器提供选择已经就绪的任务的能力。Selector 会不断地轮询注册在其上的 Channel,如果某个 Channel 上面发生读或者写事件,这个 Channel 就处于就绪状态,会被 Selector 轮询出来,然后通过 SelectionKey 可以获取就绪 Channel 的集合,进行后续的 I/O 操作。

2.3.2 NIO 服务端序列图

839d04adc89dbe9a9ccd31aa3e9d86fe.png

(1)打开 ServerSocketChannel

(2)绑定监听地址 InetSocketAddress

(3)创建 Selector,启动线程

(4)将 ServerSocketChannel 注册到 Selector,监听 ACCEPT

(5)Selector 轮询注册的 Key

(6)handleAccept() 处理新的客户端接入

(7)设置新建客户端连接的 Socket 参数

(8)向 Selector 注册监听读操作 SelectionKey.OP_READ

(9)handleRead() 异步请求消息到 ByteBuffer,收到请求

(10)decode 请求消息

(11)异步写 ByteBuffer 到 SocketChannel,发送响应

2.3.3 NIO 客户端序列图

cc879f3c6ec01be82920881f6f193100.png

(1)打开 SocketChannel

(2)设置 SocketChannel 为非阻塞模式,同时设置 TCP 参数

(3)异步连接服务端

(4)判断连接结果,如果连接成功,调到步骤10,否则执行步骤5

(5)向 Reactor 线程的多路复用器注册 OP_CONNECT 事件

(6)创建 Selector,启动线程

(7)Selector 轮询就绪的 Key

(8)handleConnect()

(9)判断连接是否完成,完成执行步骤10

(10)向多路复用器注册读事件 OP_READ

(11)handleRead() 异步从 SocketChannel 读请求到 ByteBuffer,收到请求

(12)decode 请求消息

(13)异步写 ByteBuffer 到 SocketChannel,发送响应

2.4 AIO

NIO 2.0 引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供以下两种方式获取操作结果。

通过 java.util.concurrent.Future 类表示异步操作的结果;

在执行异步操作的时候传入一个 java.nio.channels。

CompletionHandler 接口的实现类作为操作完成的回调。

NIO 2.0 的异步套接字通道是真正的异步非阻塞 I/O,对应于 UNIX 网络编程中的事件驱动 I/O(AIO)。它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写,从而简化了 NIO 的编程模型。

2.5 4 种 I/O 的对比

同步阻塞I/O

伪异步I/O

非阻塞I/O(NIO)

异步I/O(AIO)

客户端个数:I/O线程

1:1

M:N

M:1

M:0

I/O(阻塞)类型

阻塞

阻塞

非阻塞

非阻塞

I/O(同步)类型

同步

同步

同步(I/O多路复用)

异步

API使用难度

简单

简单

复杂

一般

调试难度

简单

简单

复杂

复杂

可靠性

非常差

非常差

吞吐量

2.6 选择 Netty 的理由

什么是 Netty

Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.

Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。

Netty 的优点

功能强大

使用简单

性能高

安全

社区活跃

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188068.html原文链接:https://javaforall.net

(0)
上一篇 2026年4月17日 下午6:31
下一篇 2026年4月17日 下午6:37


相关推荐

  • dau、mau、pcu、dnu、wau、acu、uv的意思是什么?怎么分析?

    dau、mau、pcu、dnu、wau、acu、uv的意思是什么?怎么分析?dau mau pcu dnu wau acu uv 的意思是什么 怎么分析 DAU DailyActiveU 日活跃用户数量 常用于反映网站 互联网应用或网络游戏的运营情况 MAU monthlyactiv 月活跃用户人数 是在线游戏的一个用户数量统计名词 数量越大意味着玩这款游戏的人越多 PCU Peakconcurre 最高

    2026年3月26日
    2
  • 微软低代码平台_msfconsole下载

    微软低代码平台_msfconsole下载关于msfconsolemsfconsole简称msf是一款常用的渗透测试工具,包含了常见的漏洞利用模块和生成各种木马。是出家旅行的必备神器,今天我们在一起来回顾下吧。启动在终端执行servicepostgresqlstart#启动postgresql不启动也可以msfconsole常见的参数解读-p,–payload<payload>指定需要使用的payload(攻击…

    2025年9月26日
    7
  • 如何直观理解AUC评价指标?

    如何直观理解AUC评价指标?最近一直在思考如何直观理解 AUC 查了维基百科的以及网上的讲解描述 感觉仍然很难把这个概念表述得通俗易懂 直到昨天周会后拿笔在纸上画了画 感觉似乎找到了一种比较有意思的理解方法 下面就请各位看官容我慢慢道来

    2026年3月19日
    2
  • 字线与位线

    字线与位线写给自己用来复习储矩阵是存放信息的主体 它由许多存储单元排列组成 每个存储单元存放一位二值代码 0 或 1 若干个存储单元组成一个 字 也称一个信息单元 地址译码器有 n 条地址输入线 A0An 1 2n 条译码输出线 W0W2n 1 每一条译码输出线 Wi 称为 字线 它与存储矩阵中的一个 字 相对应 因此 每当给定一组输入地址时 译码器只有一条输出字线 Wi 被选中 该字线可以在存储矩阵中找到一个相应的 字 并将字中的 m 位信息 Dm 1D0 送至输出缓冲器 读出 Dm 1D0 的每条数据输出线 Di 也称为 位线 每

    2026年3月16日
    2
  • 【转行必看】程序员从零转行大模型全攻略:从入门到职业落地无坑指南

    【转行必看】程序员从零转行大模型全攻略:从入门到职业落地无坑指南

    2026年3月14日
    1
  • 计算机应用模块数量如何填写,职称计算机考试科目、模块数量介绍

    计算机应用模块数量如何填写,职称计算机考试科目、模块数量介绍原标题:职称计算机考试科目、模块数量介绍全国计算机应用能力考试坚持”实事求是,区别对待,逐步提高”的原则,不同地区、不同部门根据本地区、本部门的实际情况,确定适合本地区、本部门的考试范围要求。1、不同地区和部门自主确定应考科目数量在对专业技术人员计算机应用能力的具体要求上,各省、自治区、直辖市人事厅(局)和国务院有关部门干部(人事)部门应结合本地区、本部门的实际情况,确定本地区、本部门在评聘专业技…

    2022年5月5日
    113

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号