将ScheduledExecutorService与Netty延迟数据包一起使用

时间:2018-09-01 16:04:22

标签: java multithreading netty

我正在尝试将数据包延迟5秒,但是netty在调用channel.write之后数秒内发送该数据包。

可运行

public class SendInvalidPassword implements Runnable {
    private Player player;
    public SendInvalidPassword(Player player){
        this.player = player;
    }

    @Override
    public void run() {
        System.out.println("Sending invalid login");
        this.player.sendPacket(Identifiers.Outbound.Login_Result, Unpooled.buffer(3).writeByte(2).writeByte(0).writeByte(0));
    }
}

player.sendPacket

public void sendPacket(int[] identifiers, ByteBuf data) {
    if (this.channel.isWritable()) {
        System.out.println("Send: "+identifiers[0]+", "+identifiers[1]);
        ByteBuf d = Unpooled.buffer();
        d.writeByte(identifiers[0]).writeByte(identifiers[1]).writeBytes(data.array());
        this.channel.write(d);
    }
}

我如何安排任务

service.schedule(new SendInvalidPassword(player), 5, TimeUnit.SECONDS);

如何安排任务而不导致数据包延迟?

1 个答案:

答案 0 :(得分:0)

我知道了,context.flush在写那个包之前已经被调用了。我只是添加了一个名为sendPacketFlush的新方法,并将channel.write替换为channel.writeAndFlush,现在可以正常工作了。