Netty高性能网络通信:NIO

简介: Netty高性能网络通信:NIO

认识Netty

Netty 网络编程框架 他可以做到什么?


自定义通信协议

自定义编码/解码字节流

没有netty之前我们是用什么的?


java.net + java .io

java.nio

Mina /Grizzly


Netty的特点

并发高

基于 NIO网络通信框架,比较BIO性能得到了提升


传输快

NIO的特性之一,零拷贝,堆内存之外开辟一块内存提高传输速度,


封装好

优秀的API设计和灵活的代码调用

可以看到性能的提升都离不开NIO那NIO到底是什么?


认识NIO

BIO - BlockingIO 同步阻塞

NIO - New IO / Non-Blocking IO 同步非阻塞

AIO - Asynchronous IO 异步非阻塞


同步和异步,关注的是消息通知的机制

阻塞和非阻塞,关注的是等待消息过程中的状态

1.png



多路复用的模型

2.png



三大元素:Channel 、Buffer、Selector


Channel

FileChannel 文件管道的数据

Pipe.SinkChannel

Pipe.SourceChannel 线程间通信的管道

ServerSocketChannel

SocketChannel 用于TCP网络通信的管道

DatagramChannel 用于UDP网络通信的管道


Buffer

3.png


capacity 总体容量大小

limit 存储容量的大小,是可读写和不可读写的界线

position 已读容量的大小,已读和未读区域的界线


【使用原理】

a) 初始化,给定总容量,position=0, limit=capacity

b) 当使用put方法存入数据是,通过position来记录存储的容量变化,position不断后移,直到存储结束(写完成)

c)写完成需要调用flip方法刷新,limit=position,position=0

保障limit记录的是可读写区域的大小,position已读部分重置为空

d) 读数据直到读完成,需要调用clear方法,position=0, limit=capacity


Selector

三个元素: Selector选择器、SelectableChannel可选择的通道、SelectionKey选择键


本质上,Selector是监听器,监听的是通道是否有我们关心的操作产生,操作对应的是事件(连接、接收、读/写),使用SelectionKey代表具体的事件,在确保通道是可选择的情况下,将通道注册进选择器中,此时Selector维护的是,通道和事件之间的关联关系。

4.png



Selector,管理被注册的通道集合,以及他们的状态

SelectableChannel,是一个抽象类,提供了通道可被选择需要实现的api。

FileChannel就不是可选择的,Socket相关的通道都是可选择的

一个通道可以被注册到多个选择器上吗? 可以的

多个通道可以注册到一个选择器上,但一个通道只能在一个选择器中注册一次


SelectionKey,封装了要监听的事件,连接、接收、读、写。

一方面,Selector关心通道要处理哪些事件

另一方面,当事件触发时,通道要处理哪些事件


【使用方式】

a、首先通过open方法,获取通道,将通道设置为非阻塞的

b、通过open方法,获取选择器,将通道注册进选择器中,伴随设置通道要处理的事件(OP_ACCEPT)

c、轮询选择器,当前是否有要处理的操作 select() > 0?

如果有,要获取,待处理操作的集合Set<SelectionKey> , 进行遍历

遍历到SelectionKey时,判断对应哪种操作,不同的操作设置不同的处理方式

如OP_ACCEPT,接收客户端通道并进行注册,监听后续处理的事件,如OP_WRITE

如OP_WRITE,通过key的方法获取通道本身,读取数据并继续监听事件,如OP_READ


相关文章
|
3月前
|
编解码 分布式计算 网络协议
Netty高性能网络框架(一)
Netty高性能网络框架(一)
|
9天前
|
JSON 算法 Java
Nettyの网络聊天室&扩展序列化算法
通过本文的介绍,我们详细讲解了如何使用Netty构建一个简单的网络聊天室,并扩展序列化算法以提高数据传输效率。Netty的高性能和灵活性使其成为实现各种网络应用的理想选择。希望本文能帮助您更好地理解和使用Netty进行网络编程。
28 12
|
1月前
|
消息中间件 编解码 网络协议
Netty从入门到精通:高性能网络编程的进阶之路
【11月更文挑战第17天】Netty是一个基于Java NIO(Non-blocking I/O)的高性能、异步事件驱动的网络应用框架。使用Netty,开发者可以快速、高效地开发可扩展的网络服务器和客户端程序。本文将带您从Netty的背景、业务场景、功能点、解决问题的关键、底层原理实现,到编写一个详细的Java示例,全面了解Netty,帮助您从入门到精通。
156 0
|
1月前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
3月前
|
Java
Netty BIO/NIO/AIO介绍
Netty BIO/NIO/AIO介绍
|
3月前
|
存储 机器人 Linux
Netty(二)-服务端网络编程常见网络IO模型讲解
Netty(二)-服务端网络编程常见网络IO模型讲解
|
4月前
|
开发者
Netty运行原理问题之Netty高性能实现的问题如何解决
Netty运行原理问题之Netty高性能实现的问题如何解决
|
4月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
157 0
|
4月前
|
存储 网络协议 Java
【Netty 神奇之旅】Java NIO 基础全解析:从零开始玩转高效网络编程!
【8月更文挑战第24天】本文介绍了Java NIO,一种非阻塞I/O模型,极大提升了Java应用程序在网络通信中的性能。核心组件包括Buffer、Channel、Selector和SocketChannel。通过示例代码展示了如何使用Java NIO进行服务器与客户端通信。此外,还介绍了基于Java NIO的高性能网络框架Netty,以及如何用Netty构建TCP服务器和客户端。熟悉这些技术和概念对于开发高并发网络应用至关重要。
94 0
|
12天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
52 17

热门文章

最新文章