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