Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Netty—写入通道,直到其可写入_Java_Networking_Netty_Nio - Fatal编程技术网

Java Netty—写入通道,直到其可写入

Java Netty—写入通道,直到其可写入,java,networking,netty,nio,Java,Networking,Netty,Nio,根据,要确定通道的可写性,我们可以调用channel.isWritable,然后如果通道是可写的,则写入通道 i、 e: 但是,这个呢: private void writeIfPossible(ChannelHandlerContext ctx) { Channel channel = ctx.channel(); channel.eventLoop().execute(() -> { while (needsToWrite && chan

根据,要确定通道的可写性,我们可以调用
channel.isWritable
,然后如果通道是可写的,则写入通道

i、 e:

但是,这个呢:

private void writeIfPossible(ChannelHandlerContext ctx) {
    Channel channel = ctx.channel();
    channel.eventLoop().execute(() -> {
        while (needsToWrite && channel.isWritable()) {
            ctx.write(createMessage(), ctx.voidPromise());
        }
        ctx.flush();
    });
}
这是正确的吗?我的意思是,
channel.write
(或
ctx.write
)对频道的可写性有任何影响吗?或者我们必须在每次写入后调用
channel.flush


谢谢。

只有在调用flush()时,数据才会真正写入底层套接字。因此,如果您从未调用flush(),则isWritable()将继续返回false,直到您看到OOME为止。无论何时调用flush()都由您决定,这取决于在尝试刷新之前要缓冲多少。只有在调用flush()时,数据才会真正写入底层套接字。因此,如果您从未调用flush(),则isWritable()将继续返回false,直到您看到OOME为止。无论何时调用flush()都取决于您自己,这取决于您在尝试刷新之前要缓冲多少。

非常感谢您,毛勒先生

我的结论是:

public void sendMessages(ChannelHandlerContext ctx, RecyclableArrayList messages) {
    Channel channel = ctx.channel();
    channel.eventLoop().execute(() -> {
        int i = 0;
        while (channel.isActive() && channel.isWritable() && i < messages.size()) {
            for (int j = 0; j < 5 && i < messages.size(); j++, i++) {
                ctx.write(messages.get(i), ctx.voidPromise());
            }
            ctx.flush();
        }
        if (i < messages.size()) {
            messages.subList(0, i).clear();
            storeMessages(ctx.name(), messages);
        } else {
            messages.recycle();
        }
    });
}
public void sendMessages(ChannelHandlerContext ctx、RecyclableArrayList消息){
Channel=ctx.Channel();
channel.eventLoop().execute(()->{
int i=0;
while(channel.isActive()&&channel.isWritable()&&i

如果还有其他建议,我将不胜感激。

非常感谢毛勒先生

我的结论是:

public void sendMessages(ChannelHandlerContext ctx, RecyclableArrayList messages) {
    Channel channel = ctx.channel();
    channel.eventLoop().execute(() -> {
        int i = 0;
        while (channel.isActive() && channel.isWritable() && i < messages.size()) {
            for (int j = 0; j < 5 && i < messages.size(); j++, i++) {
                ctx.write(messages.get(i), ctx.voidPromise());
            }
            ctx.flush();
        }
        if (i < messages.size()) {
            messages.subList(0, i).clear();
            storeMessages(ctx.name(), messages);
        } else {
            messages.recycle();
        }
    });
}
public void sendMessages(ChannelHandlerContext ctx、RecyclableArrayList消息){
Channel=ctx.Channel();
channel.eventLoop().execute(()->{
int i=0;
while(channel.isActive()&&channel.isWritable()&&i
如果还有其他建议,我将不胜感激