Netty的一些笔记
- 1. 仍然要说明一点,netty仍然是一个nio,其开发者与mina是同一个人,可以认为时mina的升级版和改进版吧。
- 2. 其实对nio框架的编程的,我已经不是太热衷,毕竟就是使用一个工具而已,因为熟悉了nio的编程模式,发现这些框架都是千篇一律,只不过看看谁封装得好,效率更高而已。其实自己实现一个nio框架也未尝是件难事,但是我相信,写到最后,你会发现你写的和这些框架也肯定类似,重复造轮子不说,估计还没有别人写得好。
- 3. 写这篇博客的目的,如果我以后要用netty再编程时,使用api更方便些,方便来查找看看。
1. ServerSocket的bind流程
(1) ServerSocketChannel.open()-->之后fireChannelOpen,向上流(一般处理ServerSocket的配置信息);
(2)fireChannelOpen中调用chanel的bind方法-->bind事件(向下流)(,socket.socket().bind处理具体的绑定工作,之后触发fireChannelBound;若是执行
socket.close(),则触发fireChannelUnbound,fireChannelClosed,向上流
2. 处理Socket
(1)创建一个新的ChannelPipeline对象与之关联;
(2)创建实例NioAcceptedSocketChannel,触发fireChannelOpen,fireChannelBound,fireChannelConnected事件
(3)注册到NioWorker
(4)fireChannelBound,fireChannelConnected
3. buffer说明
(1) 用两个变量维持buffer的可读,可写的内容
+-------------------+------------------+------------------+
| discardable bytes | readable bytes | writable bytes |
| | (CONTENT) | |
+-------------------+------------------+------------------+
| | | |
0 <= readerIndex <= writerIndex <= capacity
初始值:
readerIndex=0;
wirterIndex=0;
可以读的大小: readerIndex---(writerIndex - 1), 都是包含
可写的内容: writerIndex--(capacity-1), 都是包含
丢弃的内容(Discardable bytes)-->处理已经读过的内容, 通过调用discardReadBytes() 方法丢弃, 其实执行了一个System.arrayCopy的操作.
BEFORE discardReadBytes()
+-------------------+------------------+------------------+
| discardable bytes | readable bytes | writable bytes |
+-------------------+------------------+------------------+
| | | |
0 <= readerIndex <= writerIndex <= capacity
AFTER discardReadBytes()
+------------------+--------------------------------------+
| readable bytes | writable bytes (got more space) |
+------------------+--------------------------------------+
| | |
readerIndex (0) <= writerIndex (decreased) <= capacity
netty中的字节拷贝,底层刚刚读取到的-->ChannelBuffer是零字节拷贝的;
但是ChannelBuffer-->解码器的数据处理,这个一般来说是有字节拷贝的。
4. 读取数据
(1)Bytebuffer读取到并转换为ChannelBuffer,之后触发fireMessageReceived
(2)用一个累积的ChannelBuffer读取,这个buffer是公用的, 每次读取前, 若这个Buffer已经读取了数据(一般是进行了累积),则先discardReadBytes()丢掉
已经处理过得的数据;否则第一次读取直接传递原始的ChannelBuffer,这样若第一次就可以处理完,则避免了字节的复制,更高效,否则就将数据放到缓冲区里。
(3)注意ChannelBuffer是动态分配大小的,一个channel有一个,那么要注意这个的大小,避免过大的问题。
5. 写数据,
(1)先将数据放到一个写的队列中
(2)进行输出。
6. 多线程处理事件
(1)使用ExecutionHandler,只是加入了多线程机制,进行异步处理,之后仍然是调用之后的处理器进行处理。
(2)事件的调度策略完全在于Executors的实现。
(3)MemoryAwareThreadPoolExecutor只是简单的提交任务,变成异步处理而已,增加内存的控制
(4)OrderedMemoryAwareThreadPoolExecutor保证来自同一个channel的事件A一定执行完后才执行事件B(即保证一个channel的执行顺序),但是同一个channel的所有事件
是否应该固定在同一个线程中执行,这个则没有必要。
实现的关键:ConcurrentMap<Object, Executor>, 就是一个channel,对应一个执行器,这个执行器在真正工作线程中被调度执行。
(4.1)执行器里有一个队列,保证来自同一个channel的事件都添加到里面;
(4.2)执行器执行时,依次取出事件任务进行执行。
7. 客户端的处理
(1)Boss线程,单独的负责连接的请求
(1.1)创建NioClientSocketChannel对象;先创建SocketChannel(并且调用open方法),并预先分配一个worker--》 fireChannelOpen(this);--》执行bind方法
socket().bind(localAddress),fireChannelBound(channel, channel.getLocalAddress());--》 ch.connect(remoteAddress)连接远程地址;
(1.2)具体的处理都在NioClientSocketPipelineSink类里,针对连接进行一下说明,若见建立成功,则直接扔给worker线程处理;若建立失败,则扔给boss线程处理(因为是非阻塞的,
可能一开始会建立不成功)。
(2)worker线程,负责处理建立成功的连接
8. SSL
(1)客户端, SSLHandler放在位置1, 触发握手开始的操作放到最后一个Handler的channelConnected中,
客户端握手过程(handshake):
1. beginHandshake, 执行代理任务(就是ssl会话过程中的一些计算);
2. 输出数据到服务端wrapNonAppData(这时没应用数据);
3. 检查握手状态;
分享到:
相关推荐
《基于Netty网络编程项目实战笔记》是一份深入探讨Netty框架在实际网络编程中的应用文档。Netty,作为一款高性能、异步事件驱动的网络应用程序框架,广泛应用于各种网络应用开发,包括服务器和客户端的实现。这份...
读书笔记:《Netty in Practice Netty编程实战》
Netty是一款高性能的异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本篇阅读笔记主要围绕Netty的核心组件和...了解和掌握这些知识点对于深入使用Netty进行网络编程具有重要的意义。
在Java NIO框架的基础上,Netty为开发者提供了更高级别的抽象,减少了直接使用NIO所需的复杂性,比如Java多线程和网络编程。 使用Netty的主要原因包括: 1. 数据格式封装:Netty通过编码器和解码器实现了对多种...
在本篇Netty4.0学习笔记系列之六中,我们将深入探讨Netty框架如何支持多种通讯协议,以及它在实现高效、灵活的网络通信中的关键特性。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发服务器和客户端的...
这个项目实战笔记主要涵盖了Netty的核心概念、设计模式以及如何在实际项目中运用Netty进行网络编程。 首先,Netty的核心概念包括通道(Channel)和处理器(Handler)。通道是Netty中的基本I/O抽象,它代表一个连接...
Netty4.0学习笔记系列之三是关于构建简单的HTTP服务的教程,这主要涉及网络编程、服务器开发以及Java NIO(非阻塞I/O)的相关知识。Netty是一个高性能、异步事件驱动的网络应用程序框架,它使得开发可伸缩且稳定的...
这本书《Netty源码阅读笔记》作者AsiaLee通过一系列的文章深入剖析了Netty的内部机制,旨在帮助读者理解并掌握Netty的核心功能和设计思想。 1. **Netty源码分析系列文章**:这部分内容可能涵盖了Netty的整体架构、...
本资源包包含 Netty 的全方位学习材料,包括源码、笔记和学习文档,旨在帮助开发者深入理解和掌握 Netty。 一、Netty 源码解析 Netty 的源码是理解其工作原理的关键。通过阅读源码,我们可以了解到 Netty 如何实现...
### Netty学习笔记知识点概述 #### 一、Netty简介 Netty是一个广泛使用的高性能、异步事件驱动的网络应用程序框架,它简化了网络编程的复杂性,使得开发者能够更轻松地开发高性能、高可靠性的网络服务器和客户端。...
这个“自动Netty笔记111”可能是某个开发者或学习者记录的一系列关于Netty学习过程中的关键点和理解。下面将详细阐述Netty的相关知识点。 1. **异步事件驱动模型**: Netty采用了非阻塞I/O模型,基于Java NIO(Non...
在文档中提到的一些其他技术,如iBatis和Spring,与Netty虽然不是直接相关的,但它们都是Java开发中的重要组件,有助于理解整个系统的架构和工作流程。 iBatis 是一个SQL映射框架,它允许开发者将SQL语句直接写在...
读书笔记:Java网络编程IO、Netty
这个“learning-netty.zip”压缩包包含了一份Netty的学习笔记,重点在于代码学习和源码分析,基于Netty的4.1版本。下面将围绕Netty的核心概念、特性、以及如何通过学习笔记来深入理解Netty进行详细阐述。 1. **...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发...在实际项目中,Netty可以应用于分布式系统、微服务通信、游戏服务器等多个场景,其优秀的设计和强大的性能使其成为Java网络编程的首选框架之一。
这些实战项目不仅涵盖了Netty的网络编程,还包括了协议解析、序列化与反序列化、服务注册与发现等多个层面,帮助开发者全面提升网络编程能力。 附带的"netty源码剖析视频.txt"文件很可能是课程大纲或笔记,可能包含...
Netty笔记二主要聚焦在如何使用Netty框架在服务端和客户端之间发送对象。Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。这篇博客提供了可运行的源码,方便读者...
压缩包内的文件"netty源码剖析视频教程.txt"可能是课程的详细大纲或笔记,提供了对课程内容的进一步概述,包括每个章节的重点和案例分析,是学习过程中不可或缺的参考资料。通过结合视频教程和文本资料,学习者可以...
2. **简化了NIO的使用**:使用Java NIO直接开发需要掌握Java多线程和网络编程等复杂技能,而Netty通过其强大的API和设计模式,降低了开发门槛,使得开发者可以专注于业务逻辑,而不是底层的并发和网络细节。...
Java异步NIO框架Netty实现高性能高并发无标题笔记 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨 节点...