Java 在Netty用户指南中调用ctx.write()后,为什么不调用ctx.flush()?
在Java 在Netty用户指南中调用ctx.write()后,为什么不调用ctx.flush()?,java,netty,Java,Netty,在nettyJava文档中说,所以当您想要请求刷新时,一定要调用flush(),但是在本例中,它说不需要调用ctx.flush()。但是我没有发现flush(ChannelHandlerContext-ctx)被称为它所说的那样 package io.netty.example.time; public class TimeEncoder extends ChannelOutboundHandlerAdapter { @Override public void write(Ch
netty
Java文档中说,所以当您想要请求刷新时,一定要调用flush()
,但是在本例中,它说不需要调用ctx.flush()
。但是我没有发现flush(ChannelHandlerContext-ctx)被称为它所说的那样
package io.netty.example.time;
public class TimeEncoder extends ChannelOutboundHandlerAdapter {
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
UnixTime m = (UnixTime) msg;
ByteBuf encoded = ctx.alloc().buffer(4);
encoded.writeInt((int)m.value());
ctx.write(encoded, promise); // (1)
}
}
其次,我们没有调用ctx.flush()。有一个单独的处理程序方法void flush(ChannelHandlerContext ctx),用于重写flush()操作代码>
缓冲的意义在于,您将一组数据“收集”在一起,然后一次发送所有数据,因为发送大量数据的速度与发送少量数据的速度大致相同(因为IO速度较慢) 这是分配一个4字节的缓冲区。如果你每4个字节刷新一次,效率就不高了
在某个地方会有一个刷新,但不是在这个特定的方法中。如果最后有3个字节,它们会被发送出去吗?我注意到在4.0中新的和值得注意的地方,
write()不会自动刷新。