@Override
protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out)
throws Exception {
if (in.readableBytes() < 4) {
LOG.error("MessageDecoder", "in.readableBytes < 4");
return;
}
byte[] decoded = new byte[in.readableBytes()];
in.markReaderIndex();
int readLength = 0;
byte head0 = in.readByte();
if ('@' != (char) head0) {
// Log.e("MessageDecoder", "@");
return;
}
decoded[0] = head0;
readLength++;
byte head1 = in.readByte();
if ('#' != (char) head1) {
// Log.e("MessageDecoder", "#");
return;
}
decoded[1] = head1;
readLength++;
byte head2 = in.readByte();
if ('$' != (char) head2) {
// Log.e("MessageDecoder", "$");
return;
}
decoded[2] = head2;
readLength++;
byte head3 = in.readByte();
if ('%' != (char) head3) {
// Log.e("MessageDecoder", "%");
return;
}
decoded[3] = head3;
readLength++;
if (in.readableBytes() >= 4) {
in.readBytes(decoded, 4, 4); // ��ȡЭ�鳤��
} else {
in.resetReaderIndex();
// Log.e("MessageDecoder", "read length error..");
return;
}
readLength += 4;
byte[] btLength = Bytes2Hex.hexString2Bytes(new String(decoded, 4, 4));
int cmdLength = ((btLength[0] & 0xFF) << 8) + (btLength[1] & 0xFF);
if (in.readableBytes() >= (cmdLength - readLength)) {
in.readBytes(decoded, 8, cmdLength - readLength);
out.add(new String(decoded, 0, cmdLength, "UTF-8"));
} else {
LOG.error("MessageDecoder", "未读取到指定长度数据, cmdLength = " + cmdLength);
in.resetReaderIndex();
}
}

字符串的读取和截断没有字节那么复杂,依靠readableBytes获取长度,自己控制怎么读取,怎么输出

netty字符串流分包的更多相关文章

  1. 字符串流stringstream(头文件sstream)

    今天看到一样很有趣的东西,可以用于各种类型的转换.其实一个文本可以看作一个长长的字符串,整数啊浮点数的都是字符串,于是在字符串流里面就可以很方便地玩转各种类型,比如说: #include<ios ...

  2. C++学习50 对字符串流的读写

    文件流是以外存文件为输入输出对象的数据流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据 ...

  3. 字符串流sstream[part2/使用同一个字符串流反复读写数据]

    stringstream构造函数会特别消耗内存,似乎不打算主动释放内存(或许是为了提高效率),如果你要在程序中使用同一个流反复读写大量数据,将会造成大量的内部消耗,因此建议:    1:调用clear ...

  4. 字符串流sstream[part1/基本知识]

    C++中的输入输出分为三种:基于控制台的I/O,即istream.ostream.iostream:基于文件的I/O,即ifstream.ofstream.fstream:基于字符串的I/O,即ist ...

  5. c++ 控制台流和字符串流

    前言 上一章节简单介绍c++中关于流的概念,这两章节将重点讲解如何使用,本章讲解控制台流和字符串流. 控制台输出流 输出流定义在头文件中,使用输出流最简单的方法就是 使用<<运算符.通过你 ...

  6. Java中的字符串流的读取和写入(创建文件并判断重复账户)

    各位我又来了!!哎!好心酸!我还没注册到三天!!没法登上博客的首页!!心累!! import java.io.BufferedOutputStream; import java.io.Buffered ...

  7. 流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作

    一.IO.流 数据的输入和输出(input/output简写为I/O) 对标准输入设备和标准输出设备的输入输出简称为标准I/O 对在外存磁盘上文件的输入输出简称为文件I/O 对内存中指定的字符串存储空 ...

  8. stringstream类操作字符串流

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  9. C++ 学习笔记之——字符串和字符串流

    1. 字符数组 字符数组,也就是存放字符类型数据的数组,只不过字符数组的结尾必须是 '\0'.C++ 已经提供了一些字符串处理函数,这些函数被封装在头文件 和 <string.h> 中. ...

随机推荐

  1. SpringMVC修改视图定位

    @ 目录 什么是视图定位 修改springmvc-servlet.xml 修改IndexController 移动index.jsp 测试 什么是视图定位 如果代码写成这样,就表示跳转到页面 inde ...

  2. idea提升效率的插件

    这篇文章用于记录idea插件.多分类记录确实可以提升效率. 1. FindBugs 虽说Idea本身提供的代码检查工具已经很强大了,但Idea提供的更多是规范性的检查,如果需要深入地检查异常,可以使用 ...

  3. max user processes 导致的服务器大量close_wait问题解决过程

    1.背景: 由于现网业务量增长过快,需要扩容应用程序服务器,分担来自前端的访问压力. 2.故障: 部署好业务启动程序后,发现程序运行一小会后不产生新的日志和数据. 3.查问题过程: 1.首先查看程序运 ...

  4. IntelliJ IDEA下git版本回退,版本还原

    原文链接:https://blog.csdn.net/hehyyoulan/article/details/80005272

  5. UnitTest单元测试框架解析【实用篇】

    UnitTest是展开自动化测试的基础——这个框架很重要!首先我们先自己写一个测试类: 1.被测试类 Widthget.py: # coding: utf-8class Widthget: def _ ...

  6. Kafka Broker源码:网络层设计

    一.整体架构 1.1 核心逻辑 1个Acceptor线程+N个Processor线程(network.threads)+M个Request Handle线程(io threads) 多线程多React ...

  7. vim编辑器 与etc目录

    第1章         目录结构 1.1  vim  vim故障 vim  是vi的升级版本 vi类似于文本文档  vim类似于notepad++ 编辑 必须先安装vim命令 yum -y insta ...

  8. 趣味vi:Do you love me?

    看到网上有很多这样的小趣味exe,自己用labview也做了一个,可能有很多bug,马马虎虎能用,大家可以发给自己滴那个人,哈哈哈.源码vi和exe文件都在链接中https://files.cnblo ...

  9. oeasy教您玩转linux010105详细手册man

    详细手册 回忆上节课 我们上节课学习了使用命令来了解命令 whatis 我们通过他来发出灵魂之问 whatis到底是干什么的?

  10. 如何使用Xdebug单步调试PHP游戏服务器

    参考文章:https://www.sourcetoad.com/resources/debugging-php-save-time-with-xdebugs-remote-autostart/ 配置参 ...