Netty - 注册时无法写入通道(channelRegistered 事件)

Posted

技术标签:

【中文标题】Netty - 注册时无法写入通道(channelRegistered 事件)【英文标题】:Netty - can not write to channel at registration (channelRegistered event) 【发布时间】:2017-05-09 22:21:25 【问题描述】:

我遇到了一个关于在频道注册时发送数据包的问题(客户端 -> 服务器)。 为了进一步测试,如果我在注册后发送数据包,我就可以发送数据包。 相反的方式(服务器 - >客户端)工作得很好。 注册功能:

@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 事件是否已触发,但它没有。 (我的解码类也没有解码数据)

有什么假设吗?

【问题讨论】:

【参考方案1】:

channelRegistered 在频道注册到它的 EventLoop 时被调用。这并不意味着它已经准备好发送数据,通道甚至还没有打开一个套接字。 你想要channelActive,它在通道处于活动状态时调用,即准备发送和接收数据。

【讨论】:

我明白了,我想我不应该急于阅读 API 描述,谢谢您的启发:)

以上是关于Netty - 注册时无法写入通道(channelRegistered 事件)的主要内容,如果未能解决你的问题,请参考以下文章

从其他应用程序线程写入Netty通道

Netty源码之写入数据

Netty源码_NioEventLoop详解

Netty Channel.write 线程安全吗?

Netty4 Channel 概述(通道篇)

Netty 3.95 Channel 写入和使用 setTrafficClass