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()), 拿到实际有用的报文,问题解决!!
 
原文链接:https://blog.csdn.net/zhuge134/article/details/82823151


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM