繁体   English   中英

用Netty发送的目标消息无法正确解码

object message sent with Netty can't be decoded correctly

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我尝试通过PingMessage发送对象消息PingMessage 在通道管道中添加ObjectEncoderObjectDecoder 客户端已成功发送数据包,但服务器无法解码该消息。 ObjectDecoder#decode()仅返回null。 Netty版本是4.1.28.Final。

PingMessage

public class PingMessage implements Serializable {
    private static final long serialVersionUID = 1L;
    private int flag = 0xff3e;
    private String ping = "ping";

    public int getFlag() {
        return flag;
    }

    public void setFlag(int flag) {
        this.flag = flag;
    }

    public String getPing() {
        return ping;
    }

    public void setPing(String ping) {
        this.ping = ping;
    }
}

客户

public class HeartbeatInitializer extends ChannelInitializer<Channel> {

    protected void initChannel(Channel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        pipeline.addLast(new ObjectEncoder());
        pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.weakCachingResolver(PongMessage.class.getClassLoader())));
        pipeline.addLast(new IdleStateHandler(BusinessConstant.READER_IDLE_SECONDS, BusinessConstant.WRITER_IDLE_SECONDS, 0));
        pipeline.addLast(new HeartbeatServerHandler());
        pipeline.addLast(new ClientHandler());
    }
}

public class HeartbeatServerHandler extends ChannelDuplexHandler {
        private static Logger logger = LoggerFactory.getLogger(HeartbeatServerHandler.class);

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent idleState = (IdleStateEvent)evt;
            if (idleState.state() == IdleState.READER_IDLE) {
            } else if (idleState.state() == IdleState.WRITER_IDLE) {
                try {
                    ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync(); 
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

服务器

public class HeartbeatInitializer extends ChannelInitializer<Channel> {

    protected void initChannel(Channel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        pipeline.addLast(new ObjectEncoder());
        pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.weakCachingResolver(this.class.getClassLoader())));
        pipeline.addLast(new IdleStateHandler(BusinessConstant.READER_IDLE_SECONDS, BusinessConstant.WRITER_IDLE_SECONDS, 0));
        pipeline.addLast(new HeartbeatServerHandler());
        pipeline.addLast(new ClientHandler());
    }
}

public class HeartbeatServerHandler extends ChannelDuplexHandler {
    private static Logger logger = LoggerFactory.getLogger(HeartbeatServerHandler.class);

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        if (msg instanceof PingMessage) {
            logger.info("received ping");
            return;
        }
    }
}

netty源代码调试信息

AbstractChannelHandlerContext#invokeChannelRead()

((ChannelInboundHandler) handler()).channelRead(this, msg);

msg变量是

UnpooledUnsafeDirectByteBuf(ridx:0,widx:61,cap:1024)

ObjectDecoder#decode()仅返回null

ObjectDecoder超类是LengthFieldBasedFrameDecoder LengthFieldBasedFrameDecoder#decode()返回null

// LengthFieldBasedFrameDecoder#decode()

int frameLengthInt = (int) frameLength;
if (in.readableBytes() < frameLengthInt) {
    return null; // get executed and return null
}
问题暂未有回复.您可以查看右边的相关问题.
2 Netty DNS答案部分未正确解码

我正在使用netty的DNS客户端。 为了测试它,我编写了一个带有netty的简单DNS服务器,该服务器返回我期望的DnsRecords。 这是我的客户代码: TEST_BASE_RECORD_NAME是在答案部分包含3个DnsPtrRecords的记录。 在TEST_D ...

3 根据解码的消息设置 netty 响应编码

我正在编写一个 netty TCP 服务器,它必须根据请求中的responseType值对响应进行编码,例如返回 Protobuf 或 JSON。 建议的实现方法是什么? 我们的服务器有一个带有解码器、编码器和处理程序的管道。 我考虑使用解码器将正确的编码器添加到管道中,就像这样 这似乎 ...

2021-05-27 17:32:06 1 28   netty
4 Netty 服务器无法获取客户端发送的所有消息

我在项目中有一个 netty 服务器和客户端,想在它们之间交换消息。 netty 服务器代码: netty 客户端代码: 服务器处理程序代码: 客户端处理程序代码: 消息解码器代码: messageEncoder 代码: SerializeUtil 代码,我使用 p ...

2020-06-10 09:28:37 2 59   netty
5 图片无法解码

我正在使用通用图像加载器。它工作正常,但无法解码少量图像。 logcat错误-解码返回的错误图像无法解码。 请在下面的示例代码中找到相同的代码。 在我的getview中应该有五个图像,但是它正在加载3个图像和我设置的两个默认图像,而不是从Web服务器。 ...

6 Netty Bytebuf writeShort无法正确发送到C客户端

我试图搜索整个Google以获得正确的要求。 但是我仍然没有得到什么。 问题出在这里:我有一个用C语言编写的tcp客户端。 将二进制流发送到Netty的tcp服务器很简单。 首先,简单点说,tcp服务器仅将服务器和客户端之间的全部数据回显。 但是将Bytebuf“ writeShort ...

2017-11-07 03:07:53 1 65   tcp/ netty
9 服务器无法向客户端发送消息

我想创建一个服务器和客户端相互通信的应用程序。 这里的代码... 服务器端: } 从客户端发送的消息正确接收到服务器,现在来自服务器的消息写入套接字,但无法在客户端读取。 在客户端: 日志显示: 06-17 W / System.err(1777):a ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM