Netty源代码学习——Included transports(变速箱)
Transport API核心:
Channel介面
类图表示Channel含有Pipeline和Config接口,pipeline上一节有所介绍。
Channel是线程安全的,这表示在多线环境下操作同一个Channel。不会有数据问题。
final Channel channel = null;
final ByteBuf buf = Unpooled.copiedBuffer("your data",
CharsetUtil.UTF_8); // #1
Runnable writer = new Runnable() { // #2
@Override
public void run() {
channel.write(buf.duplicate());
}
};
Executor executor = Executors.newCachedThreadPool(); // #3
// write in one thread
executor.execute(writer); // #4
// write in another thread
executor.execute(writer); // #5 #1 Create ByteBuf that holds data to write
#2 Create Runnable which writes data to channel
#3 Obtain reference to the Executor which uses threads to execute tasks
#4 Hand over write task to executor for execution in thread
#5 Hand over another write task to executor for execution in thread
This method guarantees that the messages are written in the same order as you passed them to the write method.(这种方法保证信息被写入到Channel中的顺序和调用write方法的顺序是一致的。)
Transports:
每一个传输方式都有相应的EventLoop:
最后一个ThreadPerChannelEventLoop就是OIO(Old-IO)的事件监听器。
NIO – Nonblocking I/O:
provides a way to transfer the bytes from the file system to the networkstack without copying the bytes from the kernel space to the user space. Be aware that not all operation systems support this. Please refer to operating system’s documentation to find
out if it’s supported. Also, be aware that you’ll only be able to benefit from this if you don’t use any encryption/compression of the data. Otherwise it will need to copy the bytes first to the user space to do the actual work, so only transferring the raw
content of a file makes use of this feature. What actually would work is to „pre-encrypt“ a file before transfer it.One application that can really make use of this is an FTP or HTTP server that downloads big files.The next transport I’ll discuss is the OIO
transport, which provides a blocking transport.
大概意思:“zero-file-copy”是只提供给NIO传输方式使用的特性。这个特性同意你以非常快而且高效的方式从文件系统之中来传输内容。这个特性把本地文件里的字节内容能够不通过从内核空间拷贝到用户空间的情况下通过网络传输出去。
请注意并非全部的操作系统支持这一特性。
请參考详细的操作系统文档来查看这个特性的实现情况。相同请注意假设要使用这一特性,请不要把源数据进行不论什么的编解码操作。否则的话会把源数据从内核空间拷贝到用户空间里去做编解码操作,所以唯独发送源数据才会用到这一特性。更实际点的就是把源数据事先以加密的形式保存。
基于FTP或者HTTP服务的用于下载大文件的应用程序能够从这个特性中获益。
OIO – Old blocking I/O:
but it has its use cases.
on the socket may block at any time. If you share the same thread over more than one connection (socket), this could lead to a situation where blocking an operation could block all other sockets from doing their
work.
This timeout specifies the maximum number of milliseconds to wait for an I/O operation to complete. If the operation doesn’t complete within the specified timeout, a SocketTimeoutException is thrown. Netty catches this SocketTimeoutException and moves on with
its work. Then on the next EventLoop run, it tries again. Unfortunately, this is the only way to do this and still confirm the inner working of Netty. The problem with this approach is that firing the SocketTimeoutException isn’t free, as it needs to fill
the StrackTrace, and so on.
Local – In VM transport :
Netty contains the so-called local transport. This transport implementation can be used to communicate within a VM and still use the same API you’re used to. The transport is fully asynchronous as NIO .
Embedded transport:
transport allows you to interact with your different ChannelHandler implementation more easily. It’s also easy to embed ChannelHandler instances in other ChannelHandlers and use them like a helper class.This is often used in test cases to test a specific ChannelHandler
implementation, but can also be used to re-use some ChannelHandler in your own ChannelHandler without event extend it. For this purpose, it comes with a concrete Channel implementation.
版权声明:本文博主原创文章,博客,未经同意不得转载。
Netty源代码学习——Included transports(变速箱)的更多相关文章
- Netty源代码学习——EventLoopGroup原理:NioEventLoopGroup分析
类结构图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd29ya2luZ19icmFpbg==/font/5a6L5L2T/fontsize/400/f ...
- Netty源代码学习——ChannelPipeline模型分析
參考Netty API io.netty.channel.ChannelPipeline A list of ChannelHandlers which handles or intercepts i ...
- struts2源代码学习之初始化(一)
看struts2源代码已有一段时日,从今天開始,就做一个总结吧. 首先,先看看怎么调试struts2源代码吧,主要是下面步骤: 使用Myeclipse创建一个webproject 导入struts2须 ...
- [Java] LinkedList / Queue - 源代码学习笔记
简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...
- 开源中国安卓client源代码学习(一) 渐变启动界面
开源中国安卓client源代码学习(一) 渐变启动界面 准备学习安卓开发, 看到网上有人推荐开源中国安卓client的源代码, 说里面包括了大部分技术, 于是准备好好研究研究. 特开通此系列博客来记录 ...
- 读Flask源代码学习Python--config原理
读Flask源代码学习Python--config原理 个人学习笔记,水平有限.如果理解错误的地方,请大家指出来,谢谢!第一次写文章,发现好累--!. 起因 莫名其妙在第一份工作中使用了从来没有接 ...
- nginx源代码学习资源(不断更新)
nginx源代码学习是一个痛苦又快乐的过程,以下列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源代码,能够从nginx官方站点下载一份最新的. 看了nginx源代码,发现这是一份 ...
- JDK源代码学习系列07----Stack
JDK源代码学习系列07----Stack 1.Stack源代码很easy ...
- netty深入学习之一: 入门篇
netty深入学习之一: 入门篇 本文代码下载: http://download.csdn.net/detail/cheungmine/8497549 1)Netty是什么 Netty是Java NI ...
随机推荐
- JS+CSS实现选项卡功能
[小小一记] 首先我们写一个选项卡的结构出来,包括tab和content: 首先是tab: <ul class="ttitle-box-tabs" id="tabs ...
- java 读入换行
java中实现换行有以下几种方法:1.使用java中的转义符"\r\n": 注意:\r,\n的顺序是不能够对换的,否则不能实现换行的效果. 2.BufferedWriter的new ...
- MATLAB灰度图、中值滤波图
x=imread(‘x.jpg’); x=rbg2gray(x); %转成灰度图像 k=medfilt2(x); %中值滤波,默认为3X3矩阵 figure, imshow(k); medfil ...
- 小记,取GB2312汉字的首字母【转】
/// <summary> /// PY 的摘要说明. /// </summary> public class PY { // Fields private string m_ ...
- golang中设置Host Header的小Tips
前言 笔者最近时间一直在学习和写Ruby和Go,尤其是Go,作为云计算时代的标准语言,写起来还是相当有感觉的,难过其会越来越火. 不过写的过程中,也遇到了一些小问题,本文就是分享关于go语言设置 HT ...
- 高性能页面加载技术(流水线加载)BigPipe的C#简单实现(附源码)
一,BigPipe简介 BigPipe是一个重新设计的基础动态网页服务体系.大体思路是,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行.这是类似于 ...
- Powerdesigner数据库建模--概念模型--ER图【转】
转自http://www.cnblogs.com/dekevin/archive/2012/07/18/2596745.html Powerdesigner数据库建模--概念模型--ER图 目标: ...
- ☀【HTML5】Modernizr
Modernizr 使用Modernizr探测HTML5/CSS3新特性
- TOYS - POJ 2318(计算几何,叉积判断)
题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数. 分析:做的第一道计算几何题目....使用叉积判断方 ...
- poj 1328 Radar Installation【贪心区间选点】
Radar Installation Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) ...