netty官網(wǎng)的user-guide里的demo,有一個小節(jié)的內(nèi)容弄的不是特別明白。原文:netty4.x用戶指南中文:netty4.x用戶指南文章里說的,客戶端發(fā)過來的數(shù)據(jù)包,服務(wù)端是以流的形式接收的,因此需要有一個處理邏輯,來將接收到的流解析成客戶端發(fā)送來的真正的一個個的數(shù)據(jù)包。
但是我在自己的demo里,感覺不到這樣做的必要額?因為客戶端每發(fā)過來一段字符串,服務(wù)端都能通過
String recMsg = byteBuf.toString(CharsetUtil.UTF_8);
完整地解析出來,并沒覺得有必要進行文中所說的操作。
@Slf4j
public class EchoHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf buf = (ByteBuf) msg;
String msgStr = buf.toString(CharsetUtil.UTF_8);
log.info("receive message: {}", msgStr);
ChannelFuture f = ctx.write(buf);
f.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
assert f == future;
ctx.close();
}
});
}
}
是我哪里理解的有偏差嗎?比如說,客戶端寫過來的數(shù)據(jù)并不只有字符串,里面還夾雜著其他類型的數(shù)據(jù)比如一個long類型?
ByteBuf time = ctx.alloc().buffer(4); // ChannelHandlerContext ctx
String dateNow = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
long curTime = System.currentTimeMillis();
time.writeBytes(dateNow.getBytes());
time.writeLong(curTime);
ctx.writeAndFlush(time);
如果客戶端像這一行寫數(shù)據(jù),服務(wù)器單一按照string類型來解析的話,的確是會亂碼。但現(xiàn)實真的會有這種情況存在嗎?有大佬給兩個具體一點的例子么?
2 回答

白豬掌柜的
TA貢獻1893條經(jīng)驗 獲得超10個贊
其實這就是一個典型的粘包、拆包的問題。
導致的原因就是因為 TCP
是流式的,就像水流一樣沒法知道一段完整的報文到哪里是截止的。
報文越長就越可能出現(xiàn)這樣的問題。
文中提到的其實是按照字節(jié)長度來防止拆包,常見的還有通過分隔符,比如知道讀取到指定的分隔符才算做是獲取到了完整的報文。
這些其實 Netty 都是有內(nèi)置的處理器。
添加回答
舉報
0/150
提交
取消