ReplayingDecoder的原理是阻塞IO,当没有读到足够的数据时,会抛出RelayError,进入以后的LOOP中不断check是否有足够的数据。因此每次读取时我们倒要check一下buffer的数据。为此Netty提供了ReplayingDecoderBuffer这样一个代理类封装原有的buffer。以readInt为例,首先要检查是否有4个字节可读。不满足抛出ReplayError。
@Override
public int readInt() {
checkReadableBytes(4);
return buffer.readInt();
}
private void checkReadableBytes(int readableBytes) {
if (buffer.readableBytes() < readableBytes) {
throw REPLAY;
}
}
陷阱在哪呢? 我在ReplayingDecoder中使用buffer的readableBytes()发现总是一个很大数字,这个数据非常大明显超出我的数据整帧的大小好多倍。很蹊跷,我查看了一下代码发现
@Override
public int readableBytes() {
if (terminated) {
return buffer.readableBytes();
} else {
return Integer.MAX_VALUE - buffer.readerIndex();
}
}
从结果上看terminated为false,所以他返回了Integer.MAX_VALUE - buffer.readerIndex();。terminated是什么呢有什么作用呢我又查看了code,terminated仅在cleanup的时候。当terminated为true才会读到真实buffer的readableBytes和capacity。并且ReplayingDecoderBuffer为protected,只能package内部使用,我们就不能将buffer转型为该类。至于terminated的作用还是没有想明白,还是尽量别用readableBytes这个方法,绕过他去吧。
分享到:
相关推荐
Maven坐标:io.netty:netty-buffer:4.1.68.Final; 标签:netty、buffer、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...
Maven坐标:io.netty:netty-buffer:4.1.23.Final; 标签:netty、buffer、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...
Maven坐标:io.netty:netty-buffer:4.1.27.Final; 标签:netty、buffer、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...
Maven坐标:io.netty:netty-buffer:4.1.11.Final; 标签:buffer、netty、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,...
Maven坐标:io.netty:netty-buffer:4.1.65.Final; 标签:netty、buffer、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...
Maven坐标:io.netty:netty-buffer:4.1.24.Final; 标签:buffer、netty、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中...
Maven坐标:io.netty:netty-buffer:4.1.65.Final; 标签:netty、buffer、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...
Maven坐标:io.netty:netty-buffer:4.1.73.Final; 标签:buffer、netty、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...
Maven坐标:io.netty:netty-buffer:4.1.11.Final; 标签:buffer、netty、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...
Maven坐标:io.netty:netty-buffer:4.1.73.Final; 标签:buffer、netty、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...
Maven坐标:io.netty:netty-buffer:4.1.16.Final; 标签:netty、buffer、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...
Maven坐标:io.netty:netty-buffer:4.1.74.Final; 标签:netty、buffer、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...
Maven坐标:io.netty:netty-buffer:4.1.23.Final; 标签:netty、buffer、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...
Maven坐标:io.netty:netty-buffer:4.1.27.Final; 标签:netty、buffer、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...
Maven坐标:io.netty:netty-buffer:4.1.16.Final; 标签:netty、buffer、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...
《跟闪电侠学Netty:Netty即时聊天实战与底层原理》是一本深入浅出的Netty技术指南,旨在帮助读者掌握Netty框架,并利用它实现即时聊天应用,同时理解其底层工作原理。Netty是Java领域的一款高性能、异步事件驱动的...
Maven坐标:io.netty:netty-common:4.1.65.Final; 标签:netty、common、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...
Maven坐标:io.netty:netty-buffer:4.1.74.Final; 标签:netty、buffer、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...
Maven坐标:io.netty:netty-all:4.1.68.Final; 标签:netty、all、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke's Choice Award,见...