lengthAdjustment是修正值的意思,如果是修正值,它修正的是什么數據呢?
我們知道LengthFieldBasedFrameDecoder解碼器報文頭里面會傳一個報文體的長度值(我們稱他為長度域),其實這個修正值就是修正長度域的。
什么情況需要修正這個長度域?
Netty讀取完長度域后,就會接着讀取后續報文( 我們稱讀取完長度域后剩下的所有的報文為后續報文 ),當后續報文和長度域的值相等時,則不需要修正,lengthAdjustment=0。如果不等時,則需要修正,lengthAdjustment(可為負)+長度域的值=后續報文長度
舉幾個例子
1.下面報文結構,content就是上文說的后續報文
type | length | content |
---|---|---|
占1個字節 | 占4個字節 | 報文體 |
- 假如報文length=10,content真正的長度為10,后續報文=content=10,那lengthAdjustment=0,報文長度無修修正。
- 假如報文length=15,content真正的長度為10(說明length代表整個報文的長度,也就是content+type+content),后續報文=content=10,后續報文和length(15)不等,所以報文長度需要修正,lengthAdjustment=-5。
2.下面報文結構,content+type才是上文說的后續報文
length | type | content |
---|---|---|
占4個字節 | 占一個字節 | 報文體 |
- 假如報文length=9,content真正的長度為9,而后續報文=content+type=10,所以后續報文的長度和length(9)不等,所以報文長度需要修正,lengthAdjustment=1。
- 假如報文length=15,content真正的長度為10(說明length代表整個報文的長度,也就是content+type+content),而后續報文=content+type=11,所以后續報文的長度和length(15)不等,報文長度需要修正,所以lengthAdjustment=-4。