Netty之粘包问题解决
2019独角兽企业重金招聘Python工程师标准>>>
最近接到一项新的任务,其中涉及到用netty解决粘包问题,该问题解决得很顺利。下面是一些心得体会。
我们知道,netty当中有boss线程和worker线程,通常是1对多的关系,可以理解为boss接到客户的请求之后,分配给其中一个worker去处理,如果客户过多,可能会出现一个worker服务多个客户的情况。这是背景。
按照我的理解,粘包问题解决的关键在于2点,1、接收到数据在无法得到及时解析的情况下,得有地方给它存下来;2、缓冲区指针的任意移动;恰好,这两点netty都能够很轻易的。下面是代码,因为公司的保密需求,将会隐去具体业务部分。
public class ProtocolAnaDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, Listout) throws Exception { Object decoded = null;
while(true){
decoded = decode(ctx, in);
if (decoded != null) {
out.add(decoded);
} else{
return;
}
}
}
private Object decode(ChannelHandlerContext ctx, ByteBuf in) {
//标记当前读指针位置
in.markReaderIndex();
while(in.isReadable()){
byte b = in.readByte();
//业务处理部分,如果获得一个正确的消息对象,直接返回
}
//如果没有得到任何消息对象,重置读指针位置(之前mark的位置)。 in.resetReaderIndex();
return null;
}
}
转载于:https://my.oschina.net/dongtianxi/blog/703281
Netty之粘包问题解决相关推荐
- 三、Netty的粘包半包问题解决
一.定义 TCP 传输中,客户端发送数据,实际是把数据写入到了 TCP 的缓存中,粘包和半包也就会在此时产生.客户端给服务端发送了两条消息ABC和DEF,服务端这边的接收会有多少种情况呢?有可能是一次 ...
- 【Netty】Netty解决粘包和拆包问题的四种方案
在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使 ...
- Netty 解决粘包和拆包问题的四种方案
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://my.oschina.net/ ...
- Netty详解(五):Netty TCP粘包 拆包
1. 概述 无论是服务端还是客户端,我们读取或者发送消息的时候,都需要考虑TCP底层的粘包和拆包机制.下面我们来通过Netty来详解TCP底层的粘包和拆包机制. 2. TCP底层的粘包和拆包机制 TC ...
- Netty解决粘包和拆包问题的四种方案
在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使 ...
- Netty之粘包分包
粘包现象 客户端在一个for循环内连续发送1000个hello给Netty服务器端, 1 Socket socket = new Socket("127.0.0.1", 10101 ...
- 2.Netty的粘包、拆包(一)
Netty粘包.拆包 1.什么是拆包.粘包 (1)拆包.粘包介绍 TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连成一片的,其间并没有分界线.TC ...
- 【NIO与Netty】网络编程:netty中粘包、半包现象展示,分析及解决
一.粘包现象 服务端 public static void main(String[] args) {NioEventLoopGroup bossGroup=new NioEventLoopGroup ...
- 针对网上的一份netty的面试题之(netty的粘包和拆包)
什么是粘包与半包问题? 解决粘包半包问题 由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案, ...
最新文章
- iSCSI原理和实现
- electron 打包 php,electron 将现有vue项目改成支持electron桌面端应用
- tensorflow中学习率、过拟合、滑动平均的学习
- 【Bash】实现指定目录下的文件编码转换,以原文件名保存
- matlab7.0编辑运行,手把手解答win10系统运行matlab7.0时提示Runtime error的操作方案
- 操作无法完成因为已经在mysqld.exe上打开_金蝶KIS软件操作技巧/百问百答(下)...
- 精美的导航引导页html源码
- Vue之webpack之vue
- Spss典型相关分析的常见问题
- matlab人脸识别代码,基于matlab的人脸识别源代码.doc
- python实例008--摄氏温度和华氏温度转换
- 【ELIXIR】简单说下elixir的历史
- ex10_8金融应用:货币单位
- Bypass disable_function
- Java实现 LeetCode 134 加油站
- 18. --plic--=--ply--=--pli--=--ple--=--plex--=--plo-- to fold 倍,重,折叠 (词19、20)
- 旅行商问题 Traveling Salesman Problem(TSP)
- 麦克风里有电流声,杂音怎么办
- FastASR离线语音识别库
- 一次'诡异'的执行SQL报错ORA-03113的问题处理
热门文章
- CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
- 记录安装oracle的那些事(二)之双系统安装
- MaxCompute - ODPS重装上阵 第二弹 - 新的基本数据类型与内建函数
- GoldenGate复制单表开并行
- 机器学习算法一览,应用建议与解决思路
- Provisioning Services 7.8 入门系列教程之十四 UEFI支持和BOOTPTAB 编辑器
- 归纳工作中用到的Linux 命令
- Unity3D教程:自定义mesh做指向信息面板效果
- Ubuntu12.10 安装Nessus
- Linux Shell中的延时函数