C# SuperSocket利用FixedHeaderReceiveFilter或BeginEndMarkReceiveFilter进行通信

2023-10-26

        SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,我们可以有更多的时间用在业务逻辑上,SuperSocket有效的利用自己的协议解决粘包及各种事件通知机制。

        GitHub地址:https://github.com/kerryjiang/SuperSocket

一、实现功能

  • 心跳检测
  • 断线重连
  • 粘包组包

二、粘包

        一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据。TCP通讯存在粘包的主要原因是TCP是以流的方式来处理数据,所以就会引发一次接收的数据无法满足消息的需要,导致粘包的存在。处理粘包的唯一方法就是制定应用层的数据通讯协议,通过协议来规范现有接收的数据是否满足消息数据的需要。

        解决办法:

1. 消息定长:报文大小固定长度,不够空格补全,发送和接收方遵循相同的约定,这样即使粘包了通过接收方编程实现获取定长报文也能区分。
2. 包尾添加特殊分隔符:例如每条报文结束都添加回车换行符(例如FTP协议)或者指定特殊字符作为报文分隔符,接收方通过特殊分隔符切分报文区分。
3. 将消息分为消息头和消息体:消息头中包含表示信息的总长度(或者消息体长度)的字段

        SuperSocket中的常用内置协议:

  • TerminatorReceiveFilter:结束符协议
  • CountSpliterReceiveFilter:固定数量分隔符协议
  • FixedSizeReceiveFilter:固定请求大小的协议
  • BeginEndMarkReceiveFilter:带起止符的协议
  • FixedHeaderReceiveFilter:头部格式固定并且包含内容长度的协议

三、SuperSocket解决粘包说明

1、FixedHeaderReceiveFilter 将消息分为消息头和消息体来解决粘包问题

//数据格式:
//  -------+----------+------------------------------------------------------+
//  0001   | 0010     |  5412 0234 0001 0543 06215 04312 06542               |
//  请求名  | 数据长度  |  数据                                                |
//  -------+----------+------------------------------------------------------+

实现自定义的FixedHeaderReceiveFilter需要实现GetBodyLengthFromHeader与ResolveRequestInfo方法

2、BeginEndMarkReceiveFilter即为带起止符的协议

//数据格式:
//  -------+----------+------------------------------------------------------+
//  8787   |   4C36 3150 2D43 4D2B 4C30 3643 5055 2D43 4D2B 4C 4A   |  8989  |
//  固定头  |   数据                                                 |  固定尾 |
//  -------+----------+------------------------------------------------------+
public class AlgReceiveFilter : BeginEndMarkReceiveFilter<StringRequestInfo>
    {
        //开始和结束标记也可以是两个或两个以上的字节
        private readonly static byte[] BeginMark = new byte[] { (byte)'#' };
        private readonly static byte[] EndMark = new byte[] { (byte)'@' };

        public AlgReceiveFilter()
        : base(BeginMark, EndMark) //传入开始标记和结束标记
        {

        }

        protected override StringRequestInfo ProcessMatchedRequest(byte[] readBuffer, int offset, int length)
        {
            //通过解析到的数据来构造请求实例,并返回
            var totalBuffer = readBuffer.Skip(offset).Take(length).ToArray();
            var str = System.Text.Encoding.UTF8.GetString(totalBuffer);
            var body = str.Trim('#', '@');
            return new StringRequestInfo("", body, null);
        }
    }

SuperSocketDemo - 编程乐园 (errornoerror.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# SuperSocket利用FixedHeaderReceiveFilter或BeginEndMarkReceiveFilter进行通信 的相关文章

  • CTFSHOW-sql注入

    web171 最简单的sql注入 先演示基本操作 payload 1 union select 1 2 database 得到数据库名为ctfshow web 1 union select 1 2 group concat table na
  • 我的一个基于stm32的独立按键扫描方式

    这两天完成了一个stm32的工程 在解决按键时写出了一个独立按键的扫描函数 应该有前辈已经出来了 的其实质就是普通的扫描方式修改的 优点是将按键相关参数封装为一个结构体 每加一个按键都不需要在函数中增加语句 废话少说 先看扫描函数 Func
  • 提高java反射速度的方法method.setAccessible(true)

    java代码中 常常将一个类的成员变量置为private 在类的外面获取此类的私有成员变量的value时 需要注意 测试类 public class AccessibleTest private int id private String
  • 插入排序 冒泡 选择 快速

    package test public class Demo5 3 param args public static void main String args int arr1 1 6 0 1 9 3 2 44 33 77 用插入法定义一
  • DataBinding使用笔记

    1 封装Activity Fragment Dialog 要使用泛型
  • 把前端NPM和Yarn的依赖和缓存的存储位置改到D盘

    执行 npm config set prefix D App lib node npm global npm config set cache D App lib node npm cache Path 环境变量添加D App lib no
  • maven 工程结构 和 archetype 模板

    文章目录 一 maven 工程结构 1 1 jar 工程结构 1 2 war 工程结构 二 archetype 模板 2 1 推荐的 archetype 模板 2 2 自定义 archetype 模板 2 2 1 自定义模板示例 有没有好奇

随机推荐

  • 网安态势感知详细介绍

    定义 态势感知 Situation Awareness SA 能够检测出超过20大类的云上安全风险 包括DDoS攻击 暴力破解 Web攻击 后门木马 僵尸主机 异常行为 漏洞攻击 命令与控制等 利用大数据分析技术 态势感知可以对攻击事件 威
  • FPGA开发流程简述

    FPGA开发流程简述 一 概述 FPGA Field Programmable Gate Array 是一种可编程逻辑器件 以其灵活性和高性能而被广泛应用于嵌入式系统和数字电路设计 在进行FPGA开发时 需要经历一系列的流程来完成设计 验证
  • HashTable原理和底层实现

    1 概述 上次讨论了HashMap的结构 原理和实现 HashSet and HashMap源码剖析 https blog csdn net qq 27574367 article details 88526194 本文来对Map家族的另外
  • BERT :Pre-training of Deep Bidirectional Transformers for Language Understanding论文阅读笔记(NAACL 2019)

    目录 原文翻译 BERT 用于语言理解的深度双向Transformer预训练 原文链接 https aclanthology org N19 1423 pdf 摘要 1 引言 2 相关工作 2 1 基于特征的方法 2 2 微调方法 2 3
  • 基于arduino的串口控制数码管(5611AH)显示数字(初学,入门级附代码)

    基于arduino的串口控制数码管 5611AH 显示数字只有干货 首先先要介绍一下数码管了 这里图片为5611AH 这种数码管主要分为共阴极和共阳极两种 这里用的是共阴极的 注意区分 话不多说 直接上图片 此图为模拟图 当然我有实物 实物
  • vs2008创建动态库和使用动态库的方法

    一 创建动态库 打开vs2008 新建一个项目 选择win32 gt 控制台应用程序 gt 输入名称 点击确定 点击下一步 选择DLL gt 勾选空项目 点击完成 至此工程创建完毕 向工程中添加 h文件 声明接口函数 声明函数前加上关键字
  • 常用几何算法

    1 矢量减法设二维矢量 P x1 y1 Q x2 y2 则矢量减法定义为 P Q x1 x2 y1 y2 显然有性质 P Q Q P 如不加说明 下面所有的点都看作矢量 两点的减法就是矢量相减 2 矢量叉积设矢量P x1 y1 Q x2 y
  • 这个高仿小米商城项目太惊艳了

    我的引语 晚上好 我是吴小龙同学 我的公众号 菜鸟翻身 会推荐 GitHub 上好玩的项目 一分钟 get 一个优秀的开源项目 挖掘开源的价值 欢迎关注我 平时总觉得还有很多事情要去做 然而当真的闲下来时却不一定去做 比如今年这个天天在家窝
  • LPMM阅读笔记

    https www cnblogs com ChipView p 9278614 html LPMM阅读笔记 第1章 引言 LPMM阅读笔记 1 写给自己 转眼间我已经工作了两年 在这两年里 为了工作需要我看了很多相关书籍 在我看书的时候都
  • Linux·软中断&tasklet

    目录 软中断 中断服务接口管理 tasklet 软中断 首先明确一个概念软中断 不是软件中断int n 总来来说软中断就是内核在启动时为每一个内核创建了一个特殊的进程 这个进程会不停的poll检查是否有软中断需要执行 如果需要执行则调用注册
  • 网络爬虫js逆向解决网站登录RSA加密问题,不使用selenium如何实现登录,session维持登录状态请求爬取

    记录中大网校破解登录后爬取的方法 案例请求地址 中大网校会员中心 登陆入口 中大网校 使用工具 打码平台 超级鹰 分析请求 分析此请求 得知没有data 保持状态登录需要服务器知道是这个用户对应请求的相应验证码 所以要用session来维护
  • Spring Boot中自定义注解

    在Spring Boot中 我们可以通过自定义注解来实现一些特定的功能 自定义注解可以让我们的代码更加简洁 易于维护 并且可以提高代码的可读性和可扩展性 本文将介绍如何在Spring Boot中自定义注解 定义注解 首先 我们需要定义一个注
  • Qt读写CSV文件的几种方式及优劣

    前言 作为一种常见的数据交换格式 CSV Comma Separated Values 文件常常用于数据导出和导入等场合 在实际开发中 我们也需要使用Qt来实现CSV文件的读写操作 本篇博客将介绍使用Qt实现CSV读写的方法 并分析每种实现
  • ttlink无线打印服务器固件,TTLINK TT-180U1打印机服务器 TCP/IP添加打印机的教程

    使用TT 180U1 LPR添加方式 本教程以打印机为兄弟HL 2140激光打印机为实例 系统为Windows 7 64位系统 打印服务器IP固定为192 168 1 220 优点 不用安装软件 打印速度快 稳定性好 可跨网段打印 缺点 只
  • Python

    实现思路 分为两部分 第一部分 获取网页上数据并使用xlwt生成excel 当然你也可以选择保存到数据库 第二部分获取网页数据使用IO流将图片保存到本地 一 爬取所有英雄属性并生成excel 1 代码 import json import
  • Windows系统安装及初步使用ImageMagick

    最近在网上搜索了很多关于 Windows系统安装及如何使用ImageMagick 的相关文章 都没有详细说明如何使用 经过自己的摸索才明白如何使用 所以今天把它记录下来 1 首先第一步肯定是去官网下载安装包 http www imagema
  • Zotero(2)---使用Sci-hub插件下载文献

    Sci hub插件配置 如果没有安装zotero可以参考https blog csdn net u011895157 article details 126144104 spm 1001 2014 3001 5501 1 首先打开zoter
  • HTML常用的标签

    目录 1 段落 行内 换行标签 2 文本样式标签 3 表格标签 4 表单标签 1 表单域 2 表单控件 5 列表标签 6 超链接标签 7 图像标签 1 段落 行内 换行标签 为了让网页的文字有条理的显示出来 HTML有 p 段落标签 和 s
  • excel中如何将3'30"格式的分秒转换成以秒为单位的数字?

    在excel中 如记录比赛成绩的格式为3 30 要转换成以秒为单位的数字 如210秒的方式 请问该如何操作 假设你的数据在A列 A1 A100 在B1输入下面的公式 然后向下填充 TEXT 00 SUBSTITUTE LEFT A1 LEN
  • C# SuperSocket利用FixedHeaderReceiveFilter或BeginEndMarkReceiveFilter进行通信

    SuperSocket 是一个轻量级 跨平台而且可扩展的 Net Mono Socket 服务器程序框架 你无须了解如何使用 Socket 如何维护 Socket 连接和 Socket 如何工作 我们可以有更多的时间用在业务逻辑上 Supe