java - 为什么在 Netty 用户指南中调用 ctx.write() 后没有调用 ctx.flush() ?

标签 java netty

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()。有一个单独的处理程序方法 voidlush(ChannelHandlerContext ctx) ,其目的是覆盖flush()操作。 https://netty.io/wiki/user-guide-for-4.x.html#wiki-h3-8

最佳答案

缓冲的要点在于,您将一堆数据“收集”在一起并一次性发送,因为发送大量数据与发送少量数据的速度大致相同(因为 IO 是慢)。

这是分配一个 4 字节缓冲区。如果每 4 个字节刷新一次,效率不会很高。

在某个地方会有刷新,只是不在这个特定的方法中。

关于java - 为什么在 Netty 用户指南中调用 ctx.write() 后没有调用 ctx.flush() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59843899/

相关文章:

java - Web 应用程序的浏览器问题

java - Android 版 java 中的 whois

java - 使用 Netty 的异步 HTTP 客户端

java - 使用Netty(http客户端)限制HTTP持久连接每秒的事务数

Java聊天奇怪的bug

java - Hibernate Session 和 EntityManager 的区别

java - 是否可以重复从 channel 写入和读取?

netty - Netty 4 中的 IdleStateHandler?

java - 如何使用 CompareTo 对字母表进行排序

java - 首次连接后 Netty 服务器不接受连接