我遇到了有关在 channel 注册(客户端 -> 服务器)时发送数据包的问题。 进一步测试一下,如果我在注册后发送数据包,我就可以发送数据包。 相反的方式(服务器 -> 客户端)工作得很好。 注册功能:
@Override
public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
ctx.channel().write(new byte[] {0x00});
}
它还会在过滤器链中遇到编码器:
public class Encoder extends MessageToByteEncoder<byte[]>{
@Override
protected void encode(ChannelHandlerContext ctx, byte[] b, ByteBuf bb) throws Exception {
byte[] data = b.getData();
bb.writeInt(data.length);
bb.writeBytes(data);
}
}
服务器因此不会收到上述数据包 - 因此, 我调试了一下 ChannelRead 事件是否触发,但没有触发。 (我的解码类也没有解码数据)
有什么假设吗?
最佳答案
channelRegistered
在 channel 注册到其 EventLoop 时被调用。这并不意味着它已经准备好发送数据, channel 甚至还没有打开套接字。
您需要 channelActive
,它在 channel 处于 Activity 状态(即准备好发送和接收数据)时调用。
关于java - Netty - 无法在注册时写入 channel (channelRegistered 事件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41314525/