记录一次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()), 拿到实际有用的报文,问题解决!!

猜你喜欢

转载自blog.csdn.net/zhuge134/article/details/82823151