產(chǎn)生的背景
正常發(fā)送

粘包
1.要發(fā)送的數(shù)據(jù)小于TCP發(fā)送緩沖區(qū)的大小,TCP將多次寫入緩沖區(qū)的數(shù)據(jù)一次發(fā)送出去,將會發(fā)生粘包;
2.接收數(shù)據(jù)端的應(yīng)用層沒有及時讀取接收緩沖區(qū)中的數(shù)據(jù),將發(fā)生粘包;

拆包
1.要發(fā)送的數(shù)據(jù)大于TCP發(fā)送緩沖區(qū)剩余空間大小,將會發(fā)生拆包;
2.待發(fā)送數(shù)據(jù)大于MSS(最大報文長度),TCP在傳輸前將進行拆包。即TCP報文長度-TCP頭部長度>MSS。


MSS(最大報文段長度):
最大報文段長度(MSS)是TCP協(xié)議的一個選項,用于在TCP連接建立時,收發(fā)雙方協(xié)商通信時每一個報文段所能承載的最大數(shù)據(jù)長度(不包括文段頭)。
解決方案:
LineBasedFrameDecoder
LineBasedFrameDecoder的工作原理是它一次遍歷ByteBuf中的可讀字節(jié),判斷看是否有“\n”或者“\r\n”, 如果有,就以此位置為結(jié)束位置,從可讀索引到結(jié)束位置區(qū)間的字節(jié)就組成了一行。它是以換行符為結(jié)束標(biāo)志的解碼器,支持?jǐn)y帶結(jié)束符或者不攜帶結(jié)束符兩種解碼方式,同時支持配置單行的最大長度。如果連續(xù)讀取到最大長度后仍然沒有出現(xiàn)換行符,就會拋出異常,同時忽略掉之前讀到的異常碼流。
StringDecoder的功能非常簡單,就是將接收到的對象轉(zhuǎn)換成字符串,然后繼續(xù)調(diào)用后面的Handler。LineBasedFrameDecoder+StringDecoder組合就是按行切換的文本解碼器,它被設(shè)計用來支持TCP的粘包和拆包。
ch.pipeline().addLast( new LineBasedFrameDecoder(1024));
ch.pipeline().addLast( new StringDecoder());