这两个Socket网络通信框架太强大(socket框架有哪些)
ccwgpt 2024-10-27 08:48 41 浏览 0 评论
本文简述
是否曾经遇到过需要处理各种网络通信需求,却无从下手的情况?今天给大家介绍两个个超强大的Socket网络通信框架,它几乎涵盖了所有需要的通信模块!它的设计非常人性化,可以轻松地构建自己的网络通信应用。无论是初学者还是资深开发者,都能快速上手。
1、TouchSocket
简介
TouchSocket是.Net(包括 C# 、VB.Net、F#)的一个整合性的socket网络通信框架。包含了 tcp、udp、ssl、http、websocket、rpc、jsonrpc、webapi、xmlrpc、modbu等一系列的通信模块。一键式解决 tcp 黏分包问题,使用协议模板,可快速实现「固定包头」、「固定长度」、「区间字符」等一系列的数据报文解析。
支持环境
- ? .NET Framework4.5及以上
- ? .NET 6.0及以上
- ? .NET Standard2.0及以上
支持框架
- ? Console
- ? WPF
- ? Winform
- ? Blazor Server
- ? Xamarin
- ? MAUI
- ? Avalonia
- ? Mono
- ? Unity 3D(除WebGL) 其他(即所有C#系)
功能导图
特点速览
传统IOCP和TouchSocket的IOCP模式
TouchSocket的IOCP和传统也不一样,就以微软官方示例为例,他是使用MemoryBuffer开辟一块内存,均分,然后给每个会话分配一个区接收,等收到数据后,再复制接收的数据,然后把复制的数据进行处理。而TouchSocket是每次接收之前,从内存池拿一个可用内存块,然后直接用于接收,等收到数据以后,直接就把这个内存块抛出处理,这样就避免了复制操作,虽然只是细小的设计,但是在传输10w次64kb的数据时,性能相差了10倍。
数据处理适配器
相信大家都使用过其他的Socket产品,那么TouchSocket在设计时也是借鉴了其他产品的优秀设计理念,数据处理适配器就是其中之一,但和其他产品的设计不同的是,TouchSocket的适配器功能更加强大,易用,且灵活。它不仅可以提前解析数据包,还可以解析数据对象,可以随时替换,然后立即生效。例如:可以使用固定包头对数据进行预处理,从而解决数据分包、粘包的问题。也可以直接解析HTTP数据协议、WebSocket数据协议等。
兼容性与适配
TouchSocket提供多种框架模型,能够完全兼容基于TCP、UDP协议的所有协议。例如:TcpService与TcpClient,其基础功能和Socket一模一样,只是增强了框架的坚固性和并发性,将连接和接收数据通过事件的形式抛出,让使用者能够更加友好的使用。
简单示例
【TcpService】
TcpService service = new TcpService();
service.Connecting = (client, e) => {return EasyTask.CompletedTask; };//有客户端正在连接
service.Connected = (client, e) => {return EasyTask.CompletedTask; };//有客户端连接
service.Disconnected = (client, e) => {return EasyTask.CompletedTask; };//有客户端断开连接
service.Received = (client, e) =>
{
//从客户端收到信息
string mes = e.ByteBlock.ToString();
Console.WriteLine(#34;已从{client.Id}接收到信息:{mes}");
return EasyTask.CompletedTask;
};
service.Start(7789);//启动
【TcpClient】
TcpClient tcpClient = new TcpClient();
tcpClient.Connected = (client, e) => {return EasyTask.CompletedTask; };//成功连接到服务器
tcpClient.Disconnected = (client, e) => {return EasyTask.CompletedTask; };//从服务器断开连接,当连接不成功时不会触发。
tcpClient.Received = (client, e) =>
{
//从服务器收到信息
string mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);
Console.WriteLine(#34;接收到信息:{mes}");
return EasyTask.CompletedTask;
};
tcpClient.Connect("127.0.0.1:7789");
tcpClient.Send("RRQM");
【TcpClient 断线重连】 在Config的插件配置中,使用重连插件即可。
.ConfigurePlugins(a=>
{
a.UseReconnection(5, true, 1000);
});
【FixedHeaderPackageAdapter包模式】
该适配器主要解决Tcp粘分包问题,数据格式采用简单而高效的“包头+数据体”的模式,其中包头支持:
Byte模式(1+n),一次性最大接收255字节的数据。Ushort模式(2+n),一次最大接收65535字节。Int模式(4+n),一次最大接收2G数据。以上数据头均采用TouchSocketBitConverter的默认端模式(小端模式),使用者可以根据需求切换默认端模式。
TouchSocketBitConverter.DefaultEndianType = EndianType.Little;
【CustomFixedHeaderDataHandlingAdapter】
用户自定义固定包头适配器,主要帮助用户解决具有固定包头的数据帧信息。例如:下列数据格式,仅需要实现几个接口,就能完成解析,详细操作请参照API。
|1|1|1|**********|
【CustomUnfixedHeaderDataHandlingAdapter】
用户自定义不固定包头适配器,主要帮助用户解决具有包头不固定的数据帧信息。例如:最典型的HTTP数据包,其数据头和数据体由“\r\n”隔开,而数据头又因为请求者的请求信息的不同,头部数据也不固定,而数据体的长度,也是由数据头的ContentLength的值显式指定的,所以可以考虑使用CustomUnfixedHeaderDataHandlingAdapter解析,也是仅通过简单的开发,就能实现。
源码地址
https://github.com/RRQM/TouchSocket
2、weaving-socket
简介
weaving-socket以.net core 为基础,设计基于TCP通信的交互框架。是编写物联网,消息队列,websocket应用,移动通信应用,IM等完美的选择。可规范先后台交互处理,可支持,B/C,C/S,手机移动标准化的通信方式。与其他架构区别,除了同意数据接收外,架构自带内置协议,保证数据完整。
- ? 支持 Json, Bytes, custom 多种方式,分别代表,内置json协议,内置二进制协议,自定义协议(原始数据)
- ? 支持 socket(TCP),websocket,udp
安装下载
- ? nuget可搜索包
- ? Weave.TCPClient 客户端异步请求包,Weave.TcpSynClient 客户端同步请求包
- ? Weave.Server 服务端开发包
- ? U3D开发包 nuget Weave.TCPClient
运行步骤
先编写好客户端,与服务器端代码,设置好IP,PROT。然后先运行服务端,在运行客户端。
类说明
服务端类 Weave.Server 包
- ? WeaveP2Server socket服务端类库
- ? WeaveWebServer wbesocket服务端类库
- ? HttpServer HTTP协议类库
- ? WeaveUDPServer UDP服务端类库
- ? 服务类库中事件包括 weaveReceiveBitEvent - Bytes, custom 类型接收事件 waveReceiveEvent Json 类型接收事件 WeaveReceiveSslEvent ssl 证书加密接收事件 weaveDeleteSocketListEvent 客户端断链事件 weaveUpdateSocketListEvent 客户端连接上线 事件
- ? Send(soc,command, data); 服务端发送数据方法
异步客户端类 Weave.TCPClient 包
- ? P2Pclient socket客户端端类库
- ? WeaveUDPclient UDP客户端端类库
- ? 客户类库中事件包括 ReceiveServerEventbit - Bytes, custom 类型接收事件 ReceiveServerEvent Json 类型接收事件 Timeoutevent 客户端断链事件
- ? Send()客户端发送数据方法
同步客户端类 Weave.TcpSynClient 包
TcpSynClient 同步客户端类库,只有收到服务端返回响应才算完成请求。
服务端代码示例
服务端:
创建一个控制台程序,引用类库 using Weave.Base; using Weave.Server;
然后编写代码
static void Main(string[] args)
{
WeaveP2Server server = new WeaveP2Server(WeaveDataTypeEnum.Bytes);//初始化类库
server.receiveevent += Server_receiveevent;//注册接收事件
//当然还有很多其他的事件可以注册,比如新增连接事件,连接断开事件
server.start(8989);//启动监听8989端口
Console.WriteLine("8989listen:");
Console.ReadKey();
}
private static void Server_receiveevent(byte command, string data, System.Net.Sockets.Socket soc)
{
Console.WriteLine(data);//输出客户端发来的信息
}
WEBSOCKT服务端代码示例
将服务端 代码中 WeaveP2Server 类 替换成 WeaveWebServer类
UDP服务端代码示例
将服务端 代码中 WeaveP2Server 类 替换成 WeaveUDPServer类
客户代码示例
异步请求客户端:
创建一个控制台程序,引用类库 using Weave.TCPClient; using Weave.Base; 然后编写代码
P2Pclient client = new P2Pclient(DataType.bytes);//初始化类库
static void Main(string[] args)
{
client.timeoutevent += Client_timeoutevent;//注册连接超时事件
client.receiveServerEvent += Client_receiveServerEvent;//注册接收事件
client.start("127.0.0.1", 8989, false);//启动连接127.0.0.1服务器的8989端口。不需要服务器TOKEN
System.Threading.Thread.Sleep(1000);
Console.WriteLine("server link OK:");
client.send(0x1, "test2017-5-5");//给服务器发送信息,参数1,0x01指令,指令可以设置0-254,其中0x9c与0xff,是保留指令不能使用。参数2:发送string类型的数据。
Console.WriteLine("send:test2017-5-5");
Console.ReadKey();
}
private static void Client_receiveServerEvent(byte command, string text)
{
//command是从服务器发来的指令
//text是从服务器发来的数据
}
private static void Client_timeoutevent()
{
//连接超时或断线会启动此事件
client。Restart(false);//重新连接
}
同步请求客户端:
nuegt Weave.TcpSynClient
Weave.Client.TcpSynClient tcpSynClient = new TcpSynClient(Weave.Client.DataType.bytes, "127.0.0.1", 9903);
tcpSynClient.Start();
tcpSynClient.Send(0x01, "asdasd");//发送请求
while(true)
var commdata = tcpSynClient.Receives(null);//等待回执
websocket客户端:
html 中引用 websocket 客户端JS
socket = new UDCsocket({
//115.28.26.204
ip: 'ws://127.0.0.1', port: 11001, conn: function () {
// socket.settakon("123123");
alert("连接成功");
//socket.SendData(1, "login", "123123ssdfsdf", "");
}
, recData: function (text) {
//$('#test').html("");
$('#test').append("收到:" + text + '<br/> ')//这个意思你们都懂了把
}
, close: function () { alert("连接关闭"); }
, error: function (msg) { alert("连接错误" + msg); }
, jump: function (ip) { alert("服务器超过最大连接,请连接其他服务器:" + ip); }
});
socket.SendData(0x02, "GetLISTimei", '', ""); //发送内容
源码地址
https://github.com/dreamsfly900/weaving-socket
版权声明:本文来源于网络素材收集整理或网友供稿,版权归版权所有者所有,如有侵权请联系小编予以删除
相关推荐
- RACI矩阵:项目管理中的角色与责任分配利器
-
作者:赵小燕RACI矩阵RACI矩阵是项目管理中的一种重要工具,旨在明确团队在各个任务中的角色和职责。通过将每个角色划分为负责人、最终责任人、咨询人和知情人四种类型,RACI矩阵确保每个人都清楚自己...
- 在弱矩阵组织中,如何做好项目管理工作?「慕哲制图」
-
慕哲出品必属精品系列在弱矩阵组织中,如何做好项目管理工作?【慕哲制图】-------------------------------慕哲制图系列0:一图掌握项目、项目集、项目组合、P2、商业分析和NP...
- Scrum模式:每日站会(Daily Scrum)
-
定义每日站会(DailyScrum)是一个Scrum团队在进行Sprint期间的日常会议。这个会议的主要目的是为了应对Sprint计划中的不断变化,确保团队能够有效应对挑战并达成Sprint目标。为...
- 大家都在谈论的敏捷开发&Scrum,到底是什么?
-
敏捷开发作为一种开发模式,近年来深受研发团队欢迎,与瀑布式开发相比,敏捷开发更轻量,灵活性更高,在当下多变环境下,越来越多团队选择敏捷开发。什么是敏捷?敏捷是一种在不确定和变化的环境中,通过创造和响应...
- 敏捷与Scrum是什么?(scrum敏捷开发是什么)
-
敏捷是一种思维模式和哲学,它描述了敏捷宣言中的一系列原则。另一方面,Scrum是一个框架,规定了实现这种思维方式的角色,事件,工件和规则/指南。换句话说,敏捷是思维方式,Scrum是规定实施敏捷哲学的...
- 敏捷项目管理与敏捷:Scrum流程图一览
-
敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示,以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例:这个流程图涵盖了Scrum框架的主要阶段和活动,其中包...
- Mockito 的最佳实践(mock方法)
-
记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...
- EffectiveJava-5-枚举和注解(java枚举的作用与好处)
-
用enum代替int常量1.int枚举:引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。int枚举模式是类型不安全的,例如下面两组常量:性别和动物种...
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
-
Maven简介Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven是一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。仔...
- Java单元测试框架PowerMock学习(java单元测试是什么意思)
-
前言高德的技术大佬在谈论方法论时说到:“复杂的问题要简单化,简单的问题要深入化。”这句话让我感触颇深,这何尝不是一套编写代码的方法——把一个复杂逻辑拆分为许多简单逻辑,然后把每一个简单逻辑进行深入实现...
- Spring框架基础知识-第六节内容(Spring高级话题)
-
Spring高级话题SpringAware基本概念Spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的。但是在实际的项目中,你的Bean必须要意识到Spring容器...
- Java单元测试浅析(JUnit+Mockito)
-
作者:京东物流秦彪1.什么是单元测试(1)单元测试环节:测试过程按照阶段划分分为:单元测试、集成测试、系统测试、验收测试等。相关含义如下:1)单元测试:针对计算机程序模块进行输出正确性检验工作...
- 揭秘Java代码背后的质检双侠:JUnit与Mockito!
-
你有没有发现,现在我们用的手机App、逛的网站,甚至各种智能设备,功能越来越复杂,但用起来却越来越顺畅,很少遇到那种崩溃、卡顿的闹心事儿?这背后可不是程序员一拍脑袋写完代码就完事儿了!他们需要一套严谨...
- 单元测试框架哪家强?Junit来帮忙!
-
大家好,在前面的文章中,给大家介绍了以注解和XML的方式分别实现IOC和依赖注入。并且我们定义了一个测试类,通过测试类来获取到了容器中的Bean,具体的测试类定义如下:@Testpublicvoid...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)