netty字符串流分包
@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字符串流分包的更多相关文章
- 字符串流stringstream(头文件sstream)
今天看到一样很有趣的东西,可以用于各种类型的转换.其实一个文本可以看作一个长长的字符串,整数啊浮点数的都是字符串,于是在字符串流里面就可以很方便地玩转各种类型,比如说: #include<ios ...
- C++学习50 对字符串流的读写
文件流是以外存文件为输入输出对象的数据流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据 ...
- 字符串流sstream[part2/使用同一个字符串流反复读写数据]
stringstream构造函数会特别消耗内存,似乎不打算主动释放内存(或许是为了提高效率),如果你要在程序中使用同一个流反复读写大量数据,将会造成大量的内部消耗,因此建议: 1:调用clear ...
- 字符串流sstream[part1/基本知识]
C++中的输入输出分为三种:基于控制台的I/O,即istream.ostream.iostream:基于文件的I/O,即ifstream.ofstream.fstream:基于字符串的I/O,即ist ...
- c++ 控制台流和字符串流
前言 上一章节简单介绍c++中关于流的概念,这两章节将重点讲解如何使用,本章讲解控制台流和字符串流. 控制台输出流 输出流定义在头文件中,使用输出流最简单的方法就是 使用<<运算符.通过你 ...
- Java中的字符串流的读取和写入(创建文件并判断重复账户)
各位我又来了!!哎!好心酸!我还没注册到三天!!没法登上博客的首页!!心累!! import java.io.BufferedOutputStream; import java.io.Buffered ...
- 流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作
一.IO.流 数据的输入和输出(input/output简写为I/O) 对标准输入设备和标准输出设备的输入输出简称为标准I/O 对在外存磁盘上文件的输入输出简称为文件I/O 对内存中指定的字符串存储空 ...
- stringstream类操作字符串流
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- C++ 学习笔记之——字符串和字符串流
1. 字符数组 字符数组,也就是存放字符类型数据的数组,只不过字符数组的结尾必须是 '\0'.C++ 已经提供了一些字符串处理函数,这些函数被封装在头文件 和 <string.h> 中. ...
随机推荐
- SpringMVC接受表单数据
@ 目录 pojo addProduct.jsp ProductController showProduct.jsp 测试结果 pojo 新建实体类Product package pojo; publ ...
- 蓝牙bluez命令
记录一下自己平时调试蓝牙的命令,后续学习到再添加 sdptool命令: sdptool add SP - 添加SPP: sdptool add --channel=1 DID SP DUN LA ...
- linux,运维,部署 相关
基础 linux基础命令 linux基础 部署 docker
- ubuntu 本地源搭建
1.软件包放在 deps 目录下: dpkg-scanpackages deps /dev/null |gzip > deps/Packages.gz -r 2.更新 sources.list ...
- Vector-based navigation using grid-like representations in artificial agents
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Nature May 17, 2018 Received: 5 July 2017; Accepted: 3 April 2018;Pub ...
- pandas 数据类型转换及描述统计
处理数据的时候往往需要对原始数据进行类型转换和预览等操作,下面介绍常用的处理预览和数据转换方法 预览:例: import pandas as pdsec_weather = pd.read_table ...
- 简单实现C++Stack模板
栈的特点是先进后出以及只能在栈顶进行插入和删除操作 本次实现的栈的基本操作: 1)弹栈 2)压栈 3)求栈大小 4)求栈容量 5)判断栈空 6)获取栈顶元素 1.用数组的方式实现栈基本操作 /** * ...
- C++算法 线段树
线段树这个算法,看起来非常高端,而且很有用处,所以还是讲一下下吧. 温馨提示:写线段树前请做好写码5分钟,调试一辈子的准备^-^ 啊直接步入正题…… 首先我们考虑一个题目:有一个序列,要做到单点修改单 ...
- 【java学习笔记】LongAdder
目录 1.背景 2.LongAdder 3.Striped64内部结构 4.LongAdder的add方法解析 5.Striped64的longAccumulate方法解析 6.总结 LongAdde ...
- spring如何创建RESTful Service
REST REST,是指REpresentational State Transfer,有个精辟的解释什么是RESTful, 看url就知道要什么 看method就知道干什么 看status code ...