zoukankan      html  css  js  c++  java
  • netty中如何切包

    采用netty这个类库写的tcp server如何从网络上发的字节流中切包呢?这个问题netty已经有所考虑,而且已经提供了用来切包的类,本文就记录一下netty中如何切包。

    目录
    1、切包的含义
    2、netty-server的架构
    3、netty中切包的类

    1、切包的含义

    切包指的是从字节流中识别出一个一个的数据包。因为网上发来的是一个字节一个字节的流式数据,类似于下图

    字节流

    那么,如何从这个字节流中找出哪些字节是组成一个数据包的字节呢?就是如何将字节流切成一个一个数据包呢?这就是切包问题。

    2、netty-server的架构

    一个基于tcp协议的网络协议服务端主要包括3个部分,分别是切包、编解码和业务处理,如下图所示:

    netty-server的架构

    在这个架构中,第一步就是切包,只有从字节流中切出了包,才能对这个包做编解码,做了编解码这个包才变成了应用层可以理解的包,因此,才能做最后一步的业务处理。

    当然,切包也是为了解决tcp的拆包和粘包问题的,netty-server这一层有了切包功能,tcp的拆包和粘包自然被解决了,就根本不会对应用层造成任何困扰。

    3、netty中切包的类

    netty中将切包叫做编解码,netty认为切包是一种编解码,所以切包在netty中不叫切包,而叫编解码。

    Netty提供了4种切包类,分别如下:

    编号 切包器名称 类名 功能
    1 固定长度的切包器 FixedLengthFrameDecoder 每个应用层数据包的都拆分成都是固定长度的大小,这样读取字节流的时候就将读取的一个固定大小的字节块认为是一个包。
    2 行切包器 LineBasedFrameDecoder 每个应用层数据包,都以换行符作为分隔符,进行切分。
    3 基于分隔符的切包器 DelimiterBasedFrameDecoder 每个应用层数据包,都通过自定义的分隔符,进行切分。
    4 基于数据包长度的切包器 LengthFieldBasedFrameDecoder 将应用层数据包的长度,作为接收端应用层数据包的切分依据,按照应用层数据包的大小切分。这个切分器有一个要求,那就是应用层协议中包含数据包的长度。

    比较常用的就是基于长度的切包器。

    而基于长度的切包又分为6中情形,这6中情形在参考资料2中有详细的论述,可以参考。









    参考资料:
    1、https://www.jianshu.com/p/6a55b9fe4f10
    2、https://www.jianshu.com/p/a0a51fd79f62

  • 相关阅读:
    xampp只允许本地访问,禁止远程访问
    Centos 7 安装 设置 IP地址,DNS,主机名,防火墙,端口,SELinux (实测+笔记)
    centos 7.0 网卡配置及重命名教程
    VS2010 安装 MVC3 Entity Framework
    SQL 增加删除库表
    轻松绕各种WAF的POST注入、跨站防御(比如安全狗)
    CRM协同8.2升级到9.2SP2步骤
    [转]EasyUI+MVC+EF简单用户管理Demo(问题及解决)
    设置VMware随系统开机自动启动并引导虚拟机操作系统
    项目管理——随笔 2015.06.05
  • 原文地址:https://www.cnblogs.com/zhangzl419/p/15652467.html
Copyright © 2011-2022 走看看