TCP以流的方式进行数据传输,上层的应用为了对消息进行区分,往往采用如下方式
- 固定消息长度,累计读取到长度和定长
LEN的报文后,就认为读取到了个完整的消息,然后将计数器位置重置在读取下一个报文内容 - 将回车换行符作为消息结束符
\r\n,列如FTP协议,这种方式在文本中应用比较广泛 - 将特殊分隔符作为消息结束符标志位,回车换行符就是一个特殊结束分隔符(
DelimiterBasedFrameDecoder) - 通过在消息头定义一个长度字段来标示消息的总长度(
FixedLengthFrameDecoder)
Netty对以上4种做个统一抽象封装,提供了四种不同解码器来解决对应问题,使用起来也非常的方便,了解了它们,我们就不需要自己对读取的报文人工解码,也不需要考虑TCP粘包和拆包的问题了…
Delimiter自定义分隔符
我将公共的部分做了一层抽离,定义成常量方便调用
public interface EchoConstant {
String SEPARATOR = "$_";//特殊分割符号,DelimiterBasedFrameDecoder使用
Integer ECHO_DELIMITER_PORT = 4040;
Integer ECHO_LENGTH_PORT = 5050;
String HOST = "127.0.0.1";
Integer FRAME_LENGTH = 10;//固定消息长度,FixedLengthFrameDecoder使用
}
定义
EchoDelimiterServer,毫无疑问大部分代码和以前类似,区别是多了一个日志输出以及DelimiterBasedFrameDecoder的使用
划重点:在做开发调试的时候,我们可以使用Netty为我们提供的LoggingHandler输出日志
public static void bind(int port) {
EventLoopGroup masterGroup = new NioEventLoopGroup();//线程组,含一组NIO线程,专门用来处理网络事件
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBoots

最低0.47元/天 解锁文章
709

被折叠的 条评论
为什么被折叠?



