记录一次thrift传输binary类型遇到的问题

问题描述:

项目中使用thrift作为rpc框架,其中构建的一个服务的接口中使用到了binary类型,也就是字节数组。在thrift生产的java代码中,binary实际上被映射为nio的ByteBuffer类型。使用时一般是利用ByteBuffer.wrap方法将byte[]包装成ByteBuffer对象,然后传到接口方法中。在调试过程中发现接收端接收到的ByteBuffer内容和发送端的不一致,在反序列化时报错:include invalid tag(zero)。

解决方法:很显然,这个问题是由于thrift在传输binary类型时做了一些额外工作,改变了报文内容(在头尾加了一些内容)。网上关于这个问题的资料比较少,自行debug,在这个过程中我注意到接收端ByteBuffer比发送端多了很多字节,并且limit-position的值与发送端字节数一样,于是我猜测position到limit之间的字节应该就是真正发送的报文。于是将发送端的ByteBuffer的内容copy下来,然后将接收端的ByteBuffer内容copy下来,用beyondCompare作比较,果然是一致的。然后在代码中对接收端接收到的ByteBuffer做一些处理:Arrays.copyRange(byteBuffer.array(), byteBuffer.position(), byteBuffer.limit()), 拿到实际有用的报文,问题解决!!

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值