山东聊城针灸培训:Netty编程的一些笔记
来源:百度文库 编辑:偶看新闻 时间:2024/04/29 01:16:57
Netty的一些笔记
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
- 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
编程的一些常识
编程的一些问题!!
编程的一些问题
VB编程的一些问题
一些java的简单编程
一些java的简单编程
关于编程的一些问题
推荐一些简单的编程
vb的一些编程问题
我想要南开大学一些课程的笔记!哪有?
问一下我的笔记本能玩一些什么游戏
CPU是Cel-1.6G的笔记本能运行一般的编程软件么?
关于VC++的一些简单编程方法
高中VB编程的一些源代码
麻烦告诉我一些教编程的网站
麻烦告诉我一些教编程的软件。
怎样找到一些学习编程的网站
请教编程里的一些术语!
关于编程的书,大家推荐一些!
关于编程的书,大家推荐一些!
关于编程的书,大家推荐一些!
关于Visual Basic编程的一些问题
请推荐一些司法考试的网站,论坛好吗?可以下载笔记的那种
谁能给我一些大学的考研马克思主义哲学的专业试题和笔记?