最近在看netty的书,在处理粘包问题的时候,我按照上面的代码执行,但是粘包问题还是存在,而且有时候还不只是粘包的问题,还会报错。
后来发现我的Pipeline没有按照他的顺序,我开始的时候以为这个是随便顺便的,后来发现顺序不对还会出问题。
然后自己就往里面挖了一下,不是很深,发现他其实是一个链表的结构,一个接一个的顺序执行(没有看太底层,如果有错,请告知),同时也解决了我一个疑惑,就是为什么Pipeline的添加方法有那么多。addLast(),addFrist()这么多,因为他为了控制不同的位置,就如同拦截器一样(个人理解,可能不正确,但是目前看来应该是的),一层层的往下执行的。
他的最里面有一个AbstractChannelHandlerContext这个类,这个类实现了他的链表结构。
addlast最后执行的的方法是这个语句
private void addLast0(AbstractChannelHandlerContext newCtx) {
AbstractChannelHandlerContext prev = tail.prev;
newCtx.prev = prev;
newCtx.next = tail;
prev.next = newCtx;
tail.prev = newCtx;
}
里面有一个成员变量tail,这个变量是表示尾部的变量。可以通过这个变量找到这个链表的最后一个,有一个