# RRQMSocket
**Repository Path**: zengxiaorong_admin/RRQMSocket
## Basic Information
- **Project Name**: RRQMSocket
- **Description**: RRQMSocket是一个整合性网络通信框架,特点是支持高并发、事件驱动、易用性强、二次开发难度低等。其中主要内容包括:TCP服务通信框架、文件传输、RPC等内容
- **Primary Language**: C#
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://gitee.com/RRQM_Home
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 828
- **Created**: 2021-05-18
- **Last Updated**: 2021-05-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[](https://www.nuget.org/packages/RRQMSocket/)
[](https://www.apache.org/licenses/LICENSE-2.0.html)
[](https://www.nuget.org/packages/RRQMSocket/)
[](https://gitee.com/dotnetchina/RRQMSocket/stargazers)
[](https://gitee.com/dotnetchina/RRQMSocket/members)
日月之行,若出其中;星汉灿烂,若出其里。
**简体中文 | [English](./README.md)**
## 💿描述
|名称|版本(Nuget Version)|下载(Nuget Download)|描述|
|:---:|---|---|---|
|RRQMSocket| [](https://www.nuget.org/packages/RRQMSocket/) | [](https://www.nuget.org/packages/RRQMSocket/) | **RRQMSocket**是一个整合性的、超轻量级的网络通信服务框架。它具有 **高并发连接** 、 **高并发处理** 、 **事件订阅** 、 **插件式扩展** 、 **多线程处理** 、 **内存池** 、 **对象池** 等特点,让使用者能够更加简单的、快速的搭建网络框架。|
| RRQMSocket.FileTransfer | [](https://www.nuget.org/packages/RRQMSocket.FileTransfer/) | [](https://www.nuget.org/packages/RRQMSocket.FileTransfer/) | RRQMSocket.FileTransfer是一个高性能的文件传输框架,您可以用它传输**任意大小**的文件,它可以完美支持**上传下载混合式队列传输**、**断点续传**、 **快速上传** 、**传输限速**、**获取文件信息**、**删除文件**等。在实时测试中,它的传输速率可达500Mb/s。 |
|RRQMSocket.RPC | [](https://www.nuget.org/packages/RRQMSocket.RPC/) | [](https://www.nuget.org/packages/RRQMSocket.RPC/) | RRQMSocket.RPC是一个超轻量、高性能、可扩展的微服务框架,目前已完成开发RRQMRPC部分,该部分使用RRQM专属协议,支持客户端异步调用,服务端异步触发、以及out和ref关键字,函数回调等。在调用效率上也是非常强悍,在调用空载函数,且返回状态时,10w次调用仅用时3.8秒,不返回状态用时0.9s。其他扩展调用扩展协议目前已开发WebApi,后续还会支持JsonRPC,XmlRPC等。|
|RRQMSocket.RPC.WebApi | [](https://www.nuget.org/packages/RRQMSocket.RPC.WebApi/)| [](https://www.nuget.org/packages/RRQMSocket.RPC.WebApi/) | RRQMSocket.RPC.WebApi是一个扩展于RRQMSocket.RPC的WebApi组件,可以通过该组件创建WebApi服务解析器,让桌面端、Web端、移动端可以跨语言调用RPC函数。功能支持路由、Get传参、Post传参等。|
| RRQMSocket.Http | [](https://www.nuget.org/packages/RRQMSocket.Http/) | [](https://www.nuget.org/packages/RRQMSocket.Http/) | RRQMSocket.Http是一个能够简单解析Http的服务组件,能够快速响应Http服务请求。 |
## 🖥支持环境
- .NET Framework4.5及以上。
- .NET Core3.1及以上。
- .NET Standard2.0及以上。
## 🥪支持框架
- WPF
- Winform
- Blazor
- Xamarin
- Mono
- Unity
- 其他(即所有C#系)
## 🌴RRQMSocket特点速览
#### 1.对象池
对象池在RRQMSocket有很多应用,最主要的两个就是**连接对象池**和**处理对象池**。连接对象池就是当客户端成功连接时,首先会去连接对象池中找TcpSocketClient,然后没有的话,才会创建。如果哪个客户端掉线了,它的TcpSocketClient就会被回收。这也就是**ID重用**的原因。
然后就是处理对象池,在RRQMSocket中,接收数据的线程和IOCP内核线程是分开的,也就是比如说客户端给服务器发送了1w条数据,但是服务器收到后处理起来很慢,那传统的iocp肯定会放慢接收速率,然后通知客户端的tcp窗口,发生拥塞,然后让客户端暂缓发送。但是在RRQMSocket中会把收到的数据通过队列全都存起来,首先不影响iocp的接收,同时再分配线程去处理收到的报文信息,这样就相当于一个“泄洪湖泊”,能很大程度的提高处理数据的能力。
#### 2.多线程*
由于有**处理对象池**的存在,使多线程处理变得简单。在客户端连接完成时,会自动分配该客户端辅助类(TcpSocketClient)的消息处理逻辑线程,假如服务器线程数量为10,则第一个连接的客户端会被分配到0号线程中,第二个连接将被分配到1号线程中,以此类推,循环分配。当某个客户端收到数据时,会将数据排入当前线程所独自拥有的队列当中,并唤醒线程执行。
#### 3.传统IOCP和RRQMSocket
RRQMSocket的IOCP和传统也不一样的,就以微软官方为例,它是开辟了一块内存,然后均分,然后给每个会话分配一个区去接收,等收到数据以后,再复制一份,然后把数据抛出去,让外界处理。而RRQMSocket是每次接收之前,从内存池拿一个可用内存块,然后直接用于接收,等收到数据以后,直接就把这个内存块抛出去了,这样就避免了复制操作。所以,文件传输时效率才会高。当然这个操作在小数据时是没什么优势的。
#### 4.数据处理适配器
相信大家都使用过其他的Socket产品,例如HPSocket,SuperSocket等,那么RRQMSocket在设计时也是借鉴了其他产品的优秀设计理念,数据处理适配器就是其中之一,但和其他产品的设计不同的是,RRQMSocket的适配器功能更加强大,它可以无视真实的数据,而模拟出想要的数据,例如:可以对数据进行预处理,从而解决数据分包。粘包的问题,也可以直接解析HTTP协议,经过适配器处理后传回一个HttpRequest对象等。
#### 5.粘包、分包解决
在RRQMSocket中处理TCP粘包、分包问题是非常简单的。只需要更改不同的**数据处理适配器**即可。例如:使用**固定包头**,只需要给TcpSocketClient和TcpClient赋值**FixedHeaderDataHandlingAdapter**的实例即可。同样对应的处理器也有**固定长度** 、 **终止字符分割** 等。
## 🔗联系作者
- [CSDN博客主页](https://blog.csdn.net/qq_40374647)
- [哔哩哔哩视频](https://space.bilibili.com/94253567)
- [源代码仓库主页](https://gitee.com/RRQM_Home)
- 交流QQ群:234762506
## ✨API文档
[RRQMSocket API文档](https://gitee.com/RRQM_OS/RRQM/wikis/pages)
## 📦 安装
- [Nuget RRQMSocket](https://www.nuget.org/packages/RRQMSocket/)
- [微软Nuget安装教程](https://docs.microsoft.com/zh-cn/nuget/quickstart/install-and-use-a-package-in-visual-studio)
## 🍻RRQM系产品
| 名称| 版本(Nuget Version)|下载(Nuget Download)| 描述 |
|------|----------|-------------|-------|
| [RRQMCore](https://gitee.com/RRQM_OS/RRQMCore) | [](https://www.nuget.org/packages/RRQMCore/) | [](https://www.nuget.org/packages/RRQMCore/) | RRQMCore是为RRQM系提供基础服务功能的库,其中包含:内存池、对象池、等待逻辑池、AppMessenger、3DES加密、Xml快速存储、运行时间测量器、文件快捷操作、高性能序列化器、规范日志接口等。 |
| [RRQMMVVM](https://gitee.com/RRQM_OS/RRQMMVVM) | [](https://www.nuget.org/packages/RRQMMVVM/) | [](https://www.nuget.org/packages/RRQMMVVM/) | RRQMMVVM是超轻简的MVVM框架,但是麻雀虽小,五脏俱全。 |
| [RRQMSkin](https://gitee.com/RRQM_OS/RRQMSkin) | [](https://www.nuget.org/packages/RRQMSkin/) | [](https://www.nuget.org/packages/RRQMSkin/) | RRQMSkin是WPF的控件样式库,其中包含: **无边框窗体** 、 **圆角窗体** 、 **水波纹按钮** 、 **输入提示筛选框** 、 **控件拖动效果** 、圆角图片框、 **弧形文字** 、 **扇形元素** 、 **指针元素** 、 **饼图** 、 **时钟** 、 **速度表盘** 等。|
## 💐框架速览
## 一、TCP框架
#### 1.1 特点
- 简单易用。
- 多线程处理。
- IOCP完美设计模型,避免收到数据再复制。
- 简单、稳定管理客户端连接,自动检验客户端活性。
- 超简单的解决粘包、分包问题,详见[RRQMSocket解决TCP粘包、分包问题](https://blog.csdn.net/qq_40374647/article/details/110680179?spm=1001.2014.3001.5501)。
- 内存池设计,避免内存重复申请、释放。
- 对象池设计,避免数据对象的申请、释放。
#### 1.1 创建TCP服务框架
[RRQMSocket入门](https://gitee.com/dotnetchina/RRQMSocket/wikis/2.3%20%E5%88%9B%E5%BB%BA%E3%80%81%E4%BD%BF%E7%94%A8TcpService?sort_id=3897349)
#### 1.3 Demo
[RRQMSocket.Demo](https://gitee.com/RRQM_Home/RRQMSocket.Demo)
## 二、Token系TCP框架
#### 2.1 概述
Token系服务器是基于Tcp服务器一款限定连接的服务器,其主要功能就是对即将完成连接的客户端进行筛选,筛选手段就是验证Token,如果Token不符合规定,则直接断开连接,其他功能和Tcp服务器一致。
#### 2.2 特点
- 过滤不合格TCP客户端。
- 多租户使用。
- 客户端服务器统一ID,方便检索。
#### 2.3 创建及使用Token系框架
[创建及使用Token系框架](https://gitee.com/dotnetchina/RRQMSocket/wikis/3.2%20%E5%88%9B%E5%BB%BA%E3%80%81%E4%BD%BF%E7%94%A8Token%E6%9C%8D%E5%8A%A1%E5%99%A8?sort_id=3896799)
#### 2.4 Demo
[RRQMSocket.Demo](https://gitee.com/RRQM_Home/RRQMSocket.Demo)
## 三、文件传输框架
#### 3.1 创建文件服务器框架
以下进行简单示例,详细使用见[文件传输入门](https://gitee.com/dotnetchina/RRQMSocket/wikis/5.1%20%E6%A6%82%E8%BF%B0?sort_id=3897485)
```
FileService fileService = new FileService();
fileService.VerifyToken ="123ABC";
fileService.BreakpointResume = true;//支持断点续传
try
{
fileService.Bind(7789,2);//直接监听7789端口号。多线程,默认为1,此处设置线程数量为2
/* 订阅相关事件
fileService.ClientConnected += FileService_ClientConnected;
fileService.ClientDisconnected += FileService_ClientDisconnected;
fileService.BeforeTransfer += FileService_BeforeTransfer ;
fileService.FinishedTransfer += FileService_FinishedTransfer ;
fileService.ReceiveSystemMes += FileService_ReceiveSystemMes;
*/
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
```
#### 3.2 特点
- 简单易用。
- 多线程处理。
- 高性能,传输速度可达500Mb/s。
- 超简单的传输限速设置,1k-10Gb 无级调节。
- 超简单的传输速度、传输进度获取。
- 随心所欲的暂停、继续、停止传输。
- 系统化的权限管理,让敏感文件只允许私有化下载。
- 随时发送消息,让客户端和服务器交流不延迟。
- 基于事件驱动,让每一步操作尽在掌握。
- 可视化的文件块流,可以实现像迅雷一样的填充式进度条。
- 超简单的断点续传设置,为大文件传输保驾护航。
- 无状态上传断点续传设置,让同一个文件,在不同客户端之间接力上传。
- 已经上传的文件,再次上传时,可实现快速上传。
- 极少的GC释放。
#### 3.3 Demo示例
**Demo位置:** [RRQMSocket.FileTransfer.Demo](https://gitee.com/RRQM_Home/RRQMSocket.FileTransfer.Demo)
**说明:** 可以看到,图一正在上传一个Window的系统镜像文件,大约4.2Gb,传输速度已达到346Mb/s,这是因为服务器和客户端在同一电脑上,磁盘性能限制导致的。其次,GC基本上没有释放,性能非常强悍,图二是下载文件,性能依旧非常强悍。


## 四、RPC框架
#### 4.1 创建RPC服务
新建类文件,继承于ServerProvider,并将其中公共方法标识为RRQMRPCMethod即可。
```
public class Server: ServerProvider
{
[RRQMRPCMethod]
public string TestOne(string str)
{
return "若汝棋茗";
}
}
```
#### 4.2 启动RPC服务
[启动RPC服务说明](https://gitee.com/RRQM_OS/RRQM/wikis/6.3%20%E5%88%9B%E5%BB%BA%E3%80%81%E5%90%AF%E5%8A%A8RPC%E6%9C%8D%E5%8A%A1%E5%99%A8?sort_id=3984501)
#### 4.3 特点
- 简单易用。
- 多线程处理。
- 高性能,在保证送达但不返回的情况下,10w次调用用时0.8s,在返回的情况下,用时3.9s。
- 支持TCP、UDP等不同的协议调用相同服务。
- 支持指定服务异步执行。
- 支持权限管理,让非法调用死在萌芽时期。
- 全自动 **代码生成** ,可使用系统编译成dll调用,也可以使用插件生成代理调用。
- 代理方法会生成异步方法,支持客户端异步调用。
- **支持out、ref** ,参数设定默认值等。
- 随心所欲的序列化方式,除了自带的[超轻量级二进制序列化](https://blog.csdn.net/qq_40374647/article/details/114178244?spm=1001.2014.3001.5501)、xml序列化外,用户可以自己随意使用其他序列化。
- 支持编译式调用,也支持方法名+参数式调用。
- **全异常反馈** ,服务里发生的异常,会一字不差的反馈到客户端。
- 超简单、自由的**回调方式** 。
#### 4.3 Demo示例
**Demo位置:** [RRQMSocket.RPC.Demo](https://gitee.com/RRQM_Home/RRQMSocket.RPC.Demo)
**说明:**
图一、图二、图三分别为`UDP无反馈调用`、`TCP有反馈调用`、`TCP连接池有反馈调用`。调用次数均为10w次,调用性能非常nice。在无反馈中,吞吐量达14.28w,在有反馈中达2.72w,简直秒杀WCF(WCF使用http协议,在本机测试吞吐量为310)



## 致谢
谢谢大家对我的支持,如果还有其他问题,请加群QQ:234762506讨论。
## 💕 支持本项目
您的支持就是我不懈努力的动力。打赏时请一定留下您的称呼。
**赞助总金额:366.6¥**
**赞助名单:**
(以下排名只按照打赏时间顺序)
> 1.Bobo Joker
> 2.UnitySir
> 3.Coffee
