gpt4 book ai didi

java - ChannelOutboundHandlerAdapter 未被调用

转载 作者:行者123 更新时间:2023-12-01 09:50:26 25 4
gpt4 key购买 nike

我的服务器几乎没有处理程序

                            new ConnectionHandler(),
new MessageDecoder(),
new PacketHandler(),
new MessageEncoder()

看起来最后一个处理程序应该在服务器向客户端发送数据时调用,但它从未调用过。

这是处理程序的代码

public class MessageEncoder extends ChannelOutboundHandlerAdapter {

@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
System.out.println("from encoder");
NetCommand command = (NetCommand)msg;
byte[] data = JsonSerializer.getInstance().Serialize(command);
ByteBuf encoded = ctx.alloc().buffer(4+data.length);
encoded.writeInt(data.length).writeBytes(data);
ctx.writeAndFlush(encoded);
}
}

如您所见,我使用 POJO 而不是 ByteBuf,但它不起作用。即使当我尝试发送 ByteBuf 时,最后一个处理程序也不会被调用。

这也是我发送数据的方式

@Override
public void run()
{
Packet packet;
NetCommand data;
Session session;

while ( isActive )
{
try {
session = (Session) this.sessionQueue.take();
packet = session.getWritePacketQueue().take();
data = packet.getData();
System.out.println("data code: "+data.netCode);
ChannelHandlerContext ctx = packet.getSender().getContext();
ctx.writeAndFlush(data);

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

我做错了什么?

最佳答案

很可能是ChannelHandlerContext您使用 writeAndFlush()属于ChannelHandler这是在管道中的最后一个处理程序之前。如果要确保写入从管道的尾部/末尾开始,请使用 ctx.channel().writeAndFlush(...)

关于java - ChannelOutboundHandlerAdapter 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37642134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com