一些小的知识点

写入时自动释放Buffer

如下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

public class DiscardServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        ctx.write(msg);
        ctx.flush();
    }
}

此处在ChannelInboundHandlerAdapter中并没有释放接受到的消息,这是因为当写入的时候Netty会帮助我们释放。

(我简单的理解为:调用ctx的write方法,可以自动将我们的buffer的引用减一)

换一个角度理解ChannelFuture

一个 ChannelFuture 代表了一个还没有发生的IO操作。

预定义监听器代码

这个东西我在用,但是一直不知道它叫做预定义监听器:

1
2
3

writeFuture.addListener(ChannelFutureListener.CLOSE);

ByteToMessageDecoder陷阱

关于Sharable的问题我已经了解了,但是下面还有一个小问题。

一些方法如ByteBuf.readBytes(int),如果返回的缓冲区没有被释放或者添加到out List中,将会导致内存泄漏。使用像ByteBuf.readSlice(int)这样的派生缓冲区来避免内存泄漏。

(我目前Netty的代码写的还不够多,对这个问题理解的还不够深入)