`
文章列表

TCP的TIME-WAIT

原文连接:http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html 以下为对原文的阅读笔记 说明: 主动关闭的一方称为local end,被动关闭的一方称为remote end 本地IP、本地端口、远端IP、远端端口这一“四元组”称为quadruplet,也称为socket 1、TIME_WAIT主要是为了解决两个问题: a.delayed packet:新连接能够丢弃旧连接的延时到达的数据包 b.LAST ACK:确保remote end,在local end发送的ack丢失的情况下,仍能 ...
Netty关于HTTP tunnel的说明: http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/socket/http/package-summary.html#package_description 这个说明有点太简略了 一个完整的例子在这里: https://github.com/bylijinnan/nettyLearn/tree/master/ljn-netty3-httptunnel 示例里的具体流程是这样: 1.web工程(以下称为HttpServer)启动时,注册HttpTunnelingServlet并通 ...
今天看org.jboss.netty.example.http.file.HttpStaticFileServerHandler.java 可以直接往channel里面写入一个FileRegion对象,而不需要相应的encoder: //pipeline(没有诸如“FileRegionEncoder”的handler): public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeline = pipeline(); pipeline.addLast("deco ...
今天看Netty如何实现一个Http Server org.jboss.netty.example.http.file.HttpStaticFileServerPipelineFactory: pipeline.addLast("decoder", new HttpRequestDecoder()); pipeline.addLast("aggregator", new HttpChunkAggregator(65536)); pipeline.addLast("encoder", new H ...
ReadTimeoutHandler的实现思路: 开启一个定时任务,如果在指定时间内没有接收到消息,则抛出ReadTimeoutException 这个异常的捕获,在开发中,交给跟在ReadTimeoutHandler后面的ChannelHandler,例如 private final ChannelHandler timeoutHandler = new R ...
本文是阅读以下两篇文章时: http://seeallhearall.blogspot.com/2012/05/netty-tutorial-part-1-introduction-to.html http://seeallhearall.blogspot.com/2012/06/netty-tutorial-part-15-on-channel.html 我的一些笔记 =================笔记1 static class ServerDateHandler extends SimpleChannelHandler { Random random = new Rando ...
一般来说,“有状态”的ChannelHandler不应该是“共享”的,“无状态”的ChannelHandler则可“共享” 例如ObjectEncoder是“共享”的, 但 ObjectDecoder 不是 因为每一次调用decode方法时,可能数据未接收完全(incomplete), 它与上一次decode时接收到的数据“累计”起来才有可能是完整的数据,是“有状态”的 public class SomePipelineFactory implements ChannelPipelineFactory { //共享 private final StringEncoder ...
Netty是采用了Reactor模式的多线程版本,建议先看下面这篇文章了解一下Reactor模式: http://bylijinnan.iteye.com/blog/1992325 Netty的启动及事件处理的流程,基本上是按照上面这篇文章来走的 文章里面提到的操作,每一步都能在Netty里面找到对应的代码 其中Reactor里面的Acceptor就对应Netty的ServerBootstrap.boss; 而Reactor里面的Handler就对应Netty里面各ChannelHandler(在worker里面跑) 由于流程涉及到比较多的类和方法,我提取一下Netty的骨架: S ...
Netty里面采用了NIO-based Reactor Pattern 了解这个模式对学习Netty非常有帮助 参考以下两篇文章: http://jeewanthad.blogspot.com/2013/02/reactor-pattern-explained-part-1.html http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf 本文所贴的代码来自第一篇文章,在注释部分加入了我自己的理解 完整代码可以到我的github上下载,仅供参考: https://github.com/bylijinnan/nettyLearn/tree/master/lj ...
ReplayingDecoder是FrameDecoder的子类,不熟悉FrameDecoder的,可以先看看 http://bylijinnan.iteye.com/blog/1982618 API说,ReplayingDecoder简化了操作,比如: FrameDecoder在decode时,需要判断数据是否接收完全: public class IntegerHeaderFrameDecoder extends FrameDecoder { protected Object decode(ChannelHandlerContext ctx, ...
Netty3的API http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelPipeline.html 里面提到ChannelPipeline的一个“pitfall”: 如果ChannelPipeline只有一个handler(假设为handlerA)且希望用另一handler(假设为handlerB) 来取代handlerA去完成剩下的工作,那就要先add handlerB再remove handerA: Pitfall Due to the internal implementation deta ...
CompositeChannelBuffer体现了Netty的“Transparent Zero Copy” 查看API(http://docs.jboss.org/netty/3.2/api/org/jboss/netty/buffer/package-summary.html#package_description) 可以看到,所谓“Transparent Zero Copy”是通过 ChannelBuffers的wrappedBuffer方法来实现的: ChannelBuffer message = ChannelBuffers.wrappedBuffer(header, body); ...
看DelimiterBasedFrameDecoder的API,有举例: 接收到的ChannelBuffer如下: +--------------+ | ABC\nDEF\r\n | +--------------+ 经过DelimiterBasedFrameDecoder(Delimiters.lineDelimiter())之后,得到: +-----+-----+ | ABC | DEF | +-----+-----+ 而不是 +----------+ | ABC\nDEF | 为什么 ? 首先要明确,如果不指定,DelimiterBasedFram ...
Netty中传递对象的思路很直观: Netty中数据的传递是基于ChannelBuffer(也就是byte[]); 那把对象序列化为字节流,就可以在Netty中传递对象了 相应的从ChannelBuffer恢复对象,就是反序列化的过程 Netty已经封装好ObjectEncoder和ObjectDecoder 先看ObjectEncoder ObjectEncoder是往外发送对象,因此ObjectEncoder肯定是一个ChannelDownstreamHandler ObjectEncoder extends OneToOneEncoder,而OneToOneEncoder implem ...
先看看LengthFieldBasedFrameDecoder的官方API http://docs.jboss.org/netty/3.1/api/org/jboss/netty/handler/codec/frame/LengthFieldBasedFrameDecoder.html API举例说明了LengthFieldBasedFrameDecoder的解析机制,如下: 实际消息内容是“HELLO, WORLD”,长度是12 bytes(注意逗号后面有一个空格) 实例1 lengthFieldLength   = 2表示“Length”的长度,而“Length”的值 就是“Actua ...
Global site tag (gtag.js) - Google Analytics