当前位置: 首页 > 知识库问答 >
问题:

Netty编码器未执行

时仰岳
2023-03-14

我用Netty制作了一个服务器,但我遇到了一个问题。我创建的编码器没有被执行。

我在服务器上的管道:

            bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            public void initChannel(SocketChannel ch) throws Exception {
                ch.pipeline().addLast("encoder", new PacketEncoder());
                ch.pipeline().addLast("decoder", new PacketDecoder());
                ch.pipeline().addLast(new LoginServerChannel());
            }
        });

我的编码器:

public class PacketEncoder extends MessageToByteEncoder<Packet> {

@Override
protected void encode(ChannelHandlerContext channelHandlerContext, Packet packet, ByteBuf byteBuf) throws Exception {
    System.out.println("Encoding");
}

我的解码器:

public class PacketDecoder extends ReplayingDecoder<DecoderState> {

@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
    ...
}

我的通道处理程序:

public class LoginServerChannel extends SimpleChannelInboundHandler<Packet> {

@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, Packet packet) throws Exception {
    channelHandlerContext.writeAndFlush(packet.encode());

    System.out.println("Sending");
}

调用解码器,然后调用通道处理程序,但不调用编码器。我试图改变管道中的顺序,但同样的问题也试图使用fireChannelRead(...)和同样的问题。

谢谢

共有1个答案

孟韬
2023-03-14

您的编码器扩展了< code>MessageToByteEncoder

在逻辑处理程序中,您可以

 channelHandlerContext.writeAndFlush( packet.encode() );

我假设< code>encode()返回一个字节数组,所以您编码器会忽略它,什么也不做。

你可能应该做这样的事情:

channelHandlerContext.writeAndFlush( packet );
 类似资料:
  • Netty 的是一个复杂和先进的框架,但它并不玄幻。当我们请求一些设置了 key 的给定值时,我们知道 Request 类的一个实例被创建来代表这个请求。但 Netty 并不知道 Request 对象是如何转成 Memcached 所期望的。Memcached 所期望的是字节序列;忽略使用的协议,数据在网络上传输永远是字节序列。 将 Request 对象转为 Memcached 所需的字节序列,N

  • 看看文档,它说: https://netty.io/4.0/api/io/netty/channel/ChannelPipeline.html 假设用户在管道中有一个或多个ChannelHandlers来接收I/O事件(例如读取)和请求I/O操作(例如写入和关闭)。例如,一个典型的服务器在每个通道的管道中都有以下处理程序,但是根据协议和业务逻辑的复杂性和特征,这些处理程序可能会有所不同: 协议解码

  • 我使用apache camel Netty使用此代码将ebcdic输入转换为ascii。 任何建议或答案...

  • 我最近开始用netty做我的一个项目。为了理解netty是如何工作的,我实现了HexDumpProxy示例。当我在通道管道中添加StringDecoder和StringEncoder时,我遇到了一个问题,这会导致管道损坏。如果解码器/编码器不存在,程序会正常工作。有人能解释一下为什么会这样吗?非常感谢任何帮助! 下面我正在添加代码。 主要类别: 初始值设定项类: 前端处理程序类: 后端处理程序类:

  • 我正在编写超文本传输协议-server,它将执行一些非常繁重的计算。我有一些与业务逻辑和阻塞IO相关的编码器-解码器管道。 所以我决定创建另一个工人 并在最开始添加简单的处理程序: 在内蒂这样做是不是很通俗?还是有更好的方法?

  • 我希望将传入的Netty的消息转换为我的类的实例。为此,我使用以下: 现在,由于消息是引用计数的,我们必须在处理完它之后释放它。这是由我们正在扩展的自动完成的。 现在,既然ButeBuf已经发布,这难道不意味着支持阵列处于危险之中吗?它将被回收,我不确定我会在我的MyBuffer的数组中看到什么。 这个解码器可以安全使用吗?这是正确的编写方式吗?