TCP粘包產(chǎn)生原因
- 應(yīng)用程序write寫入的字節(jié)數(shù)大小大于套接字發(fā)送緩沖區(qū)的大小羔挡。
- 進(jìn)行MSS大小的TCP分段玖姑。
- 以太網(wǎng)幀的payload大于MTU進(jìn)行IP分片靠益。
用于解決TCP粘包問題的編碼器
序號 |
名字 |
作用 |
1 |
LineBasedFrameDecoder |
基于** 行 **的解碼器 |
2 |
StringDecoder |
基于** 字符串 **的解碼器 |
3 |
DelimiterBasedFrameDecoder |
基于** 分隔符 **作為碼流結(jié)束標(biāo)示的消息解碼器 |
4 |
FixedLengthFrameDecoder |
基于** 固定長度 **解碼器 |
-
LineBasedFrameDecoder -- 基于** 行 **的解碼器宣决。遍歷ByteBuf中的可讀字節(jié),判斷是否有
"\n"
或"\r\n"
吆你,如有則以此結(jié)束位置弦叶。可配置單行最大長度妇多,如達(dá)到最大長度伤哺,仍沒有發(fā)現(xiàn)換行符,則拋出異常者祖。(見代碼片段1)
// 代碼片段1
public class TimeServer {
private class ChildChanneHandler extends ChannelInitiallizer<SocketChannel> {
@override
protected void initChannel(SocketChannel arg0) throws Execption {
arg0.pipeline().addLast ( new LineBasedFrameDecoder(1024));
arg0.pipeline().addLast ( new StringDecoder());
arg0.pipeline().addLast ( new TimeClientHandler());
}
}
}
-
StringDecoder -- 基于** 字符串 **的解碼器立莉。將接收到的byte[]轉(zhuǎn)換成字符串。LineBasedFrameDecoder+StringDecoder的組合即為按行切換的文本解碼器七问。
-
DelimiterBasedFrameDecoder -- 基于** 分隔符 **作為碼流結(jié)束標(biāo)示的消息解碼器蜓耻。(見代碼片段2)
// 代碼片段2
public class EchoServer {
private class ChildChanneHandler extends ChannelInitiallizer<SocketChannel> {
@override
protected void initChannel(SocketChannel arg0) throws Execption {
ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes()))
arg0.pipeline().addLast ( new DelimiterBasedFrameDecoder(1024,delimiter));
// arg0.pipeline().addLast ( new LineBasedFrameDecoder(1024));
arg0.pipeline().addLast ( new StringDecoder());
arg0.pipeline().addLast ( new TimeClientHandler());
}
}
}
-
FixedLengthFrameDecoder -- ** 固定長度 **解碼器.(見代碼片段3)
// 代碼片段3
public class EchoServer {
private class ChildChanneHandler extends ChannelInitiallizer<SocketChannel> {
@override
protected void initChannel(SocketChannel arg0) throws Execption {
ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes()))
// arg0.pipeline().addLast ( new DelimiterBasedFrameDecoder(1024,delimiter));
// arg0.pipeline().addLast ( new LineBasedFrameDecoder(1024));
arg0.pipeline().addLast ( new FixedLengthFrameDecoder(20));
arg0.pipeline().addLast ( new StringDecoder());
arg0.pipeline().addLast ( new TimeClientHandler());
}
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者