HPSocket.Net-develop

所属分类:网络编程
开发工具:C#
文件大小:918KB
下载次数:11
上传日期:2020-08-27 11:36:45
上 传 者小清新1
说明:  C# 版socket 收发 TCP协议 有模版样例
(Csharp socket sending and receiving TCP protocol Sample with template)

文件列表:
HPSocket.Net-develop (0, 2020-05-08)
HPSocket.Net-develop\LICENSE (11558, 2020-05-08)
HPSocket.Net-develop\demo (0, 2020-05-08)
HPSocket.Net-develop\demo\Bin (0, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0 (0, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert (0, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\ca.crt (1383, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\ca.key (1766, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\ca.pem (3149, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\ca2.crt (1399, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\ca2.key (1766, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\ca2.pem (3165, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\client.cer (1415, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\client.crt (4578, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\client.csr (1098, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\client.key (1766, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\client.pem (3181, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\client2.cer (1428, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\client2.crt (4592, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\client2.csr (1098, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\client2.key (1766, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\client2.pem (6358, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\server.cer (1415, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\server.crt (4578, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\server.csr (1098, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\server.key (1766, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\server.pem (3181, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\server2.cer (1428, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\server2.crt (4592, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\server2.csr (1098, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\server2.key (1766, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\ssl-cert\server2.pem (6358, 2020-05-08)
HPSocket.Net-develop\demo\Bin\netcoreapp3.0\template.html (519, 2020-05-08)
HPSocket.Net-develop\demo\Bin\ssl-cert (0, 2020-05-08)
HPSocket.Net-develop\demo\Bin\ssl-cert\ca.crt (1383, 2020-05-08)
HPSocket.Net-develop\demo\Bin\ssl-cert\ca.key (1766, 2020-05-08)
HPSocket.Net-develop\demo\Bin\ssl-cert\ca.pem (3149, 2020-05-08)
... ...

# HPSocket.Net ## 概览 the C# SDK for [HP-Socket](https://github.com/ldcsaa/HP-Socket) #### .Net 框架支持 * `.Net Framework 2.0+` * `.Net Core 2.0+` #### 平台支持 * `Windows 7+ x86/x***` * `Linux kernel 2.6.32+ x86/x***` * `mac OS 10.12+ x***` ## 安装教程 `HPSocket.Net`通过NuGet软件包管理器部署 在 Package Manager 控制台中使用以下命令来手动安装 `HPSocket.Net` ``` Install-Package HPSocket.Net ``` 或在`Visual Studio`的解决方案中的`项目名`上`鼠标右键`->`管理 NuGet 程序包`->`浏览`页面->搜索框输入`HPSocket.Net`->然后安装 ### 关于macOS `HPSocket.Net`现在支持在`osx 10.12+`中使用`.net core2.0+`进行开发 Nuget软件包中的`libhpsocket4c.dylib`编译自`HP-Socket`的`macOS分支`[HP-Socket-for-macOS](https://gitee.com/xin_chong/HP-Socket-for-macOS) ## 组件列表 ### 基础组件 基础组件是`HP-Socket`提供的原始组件,相关使用方法请参考[HP-Socket Doc](https://github.com/ldcsaa/HP-Socket/tree/master/Doc) ##### TCP + `ITcpServer` + `ITcpAgent` + `ITcpClient` + `ITcpPullServer` + `ITcpPullAgent` + `ITcpPullClient` + `ITcpPackServer` + `ITcpPackAgent` + `ITcpPacClient` ##### UDP + `IUdpServer` + `IUdpClient` + `IUdpCast` + `IUdpArqServer` + `IUdpArqClient` + `IUdpNode` ##### SSL + `ISslServer` + `ISslAgent` + `ISslClient` + `ISslPullServer` + `ISslPullAgent` + `ISslPullClient` + `ISslPackServer` + `ISslPackAgent` + `ISslPackClient` ##### HTTP + `IHttpServer` + `IHttpsServer` + `IHttpAgent` + `IHttpsAgent` + `IHttpClient` + `IHttpsClient` + `IHttpSyncClient` + `IHttpsSyncClient` #### ThreadPool + `ThreadPool` ### 扩展组件 + `ITcpPortForwarding` + `IHttpEasyServer` + `IHttpsEasyServer` + `IHttpEasyAgent` + `IHttpsEasyAgent` + `IHttpEasyClient` + `IHttpsEasyClient` + `IWebSocketServer` + `IWebSocketAgent` + `ITcpServer` + `ITcpClient` + `ITcpAgent` + `ISslServer` + `ISslClient` + `ISslAgent` + `AsyncQueue` `HPSocket.Net` 提供一个Tcp端口转发组件`ITcpPortForwarding`,10行代码即可完成TCP端口转发 `HPSocket.Net`目前提供6个Easy组件和2个WebSocket组件,用来更简单的处理http/https/ws的数据包,`HP-Socket`提供的基础http组件,需要自己来实现数据包的完整获取,Easy组件已经做了这些处理,http/https的Easy组件绑定以下事件,当事件到达,即可获得完整数据包 + `OnEasyChunkData` http CHUNK消息的完整数据包事件 + `OnEasyMessageData` http GET或POST的完整数据包事件 + `OnEasyWebSocketMessageData` WebSocket消息的完整数据包事件 `WebSocket` 也可以直接使用以下两个组件 + `IWebSocketServer` WebSocket 服务端 + `IWebSocketAgent` WebSocket 客户端 (与其他Agent组件不同,WebSocket的Agent组件不支持连接到不同的WebSocket Server,也就是说`IWebSocketAgent`组件所有的连接都只能连接到同一个服务器) `AsyncQueue` 来自 [qq:842352715](https://gitee.com/zhige777/HPSocket.Net) ## 使用说明 1. 大部分组件使用方法请参考`demo`目录下的工程 2. `HPSocket.Net`提供的`Agent`系列组件除`Pack`系列模型外,包括`ITcpPortForwarding`组件,都支持设置`http`或`socks5`***,以`List`方式设置,可同时设置多个***,组件内部会随机使用,可以同时混用`http`和`socks5`***,使用方法参考各`Agent`组件的`demo` ### Easy扩展组件事件绑定示例 #### IHttpEasyServer ```cs // 创建 HttpEasyServer 的实例 using(IHttpEasyServer httpServer = new HttpEasyServer()) { // ...其他设置 // 绑定 OnEasyMessageData 事件 httpServer.OnEasyMessageData += (sender, id, data) => { // data 参数每次都是一个完整的数据包 // ... 处理 data return HttpParseResult.Ok; }; } ``` #### IHttpEasyAgent ```cs // 创建 HttpEasyAgent 的实例 using(IHttpEasyAgent httpAgent = new HttpEasyAgent()) { // ...其他设置 // 绑定 OnEasyMessageData 事件 httpAgent.OnEasyMessageData += (sender, id, data) => { // data 参数每次都是一个完整的数据包 // ... 处理 data return HttpParseResult.Ok; }; } ``` #### IHttpEasyClient ```cs // 创建 HttpEasyClient 的实例 using(IHttpEasyClient httpClient = new HttpEasyClient()) { // ...其他设置 // 绑定 OnEasyMessageData 事件 httpClient.OnEasyMessageData += (sender, data) => { // data 参数每次都是一个完整的数据包 // ... 处理 data return HttpParseResult.Ok; }; } ``` ### 数据接收适配器组件 完整示例在`demo/TcpServer-TestEcho-Adapter` 该系列组件是`HPSocket.Net`的`数据接收适配器`扩展组件,用户通过`自定义数据接收适配器`处理TCP通信中可能出现的应用层所谓的`“粘包”`、`“半包”`等情况。`数据接收适配器`组件看起来这与HP-Socket的`Pack`组件有些相似,但它更加灵活,适配也非常简单方便。 + `ITcpServer`/`ITcpClient`/`ITcpAgent` + `ISslServer`/`ISslClient`/`ISslAgent` ``泛型类型对象将在上列组件的`OnParseRequestBody`事件中回调。 ```cs using (ITcpServer server = new TcpServer { // 指定数据接收适配器 DataReceiveAdapter = new BinaryDataReceiveAdapter(), }) { // 不需要绑定OnReceive事件 // 这里解析的请求体事件的data就是BinaryDataReceiveAdapter.ParseRequestBody()返回的数据 // data的类型就是ITcpServer实例化时指定的byte[] server.OnParseRequestBody += (sender, id, data) => { Console.WriteLine($"OnParseRequestBody({id}) -> data length: {data.Length}"); return HandleResult.Ok; }; } ``` 目前支持`4`种适配器 #### 1. `FixedHeaderDataReceiveAdapter` 固定包头数据接收适配器 使用场景:数据包的包头长度固定且包头含包体长度。 示例:前`4字节`标识包体长度(小端字节序)。`0x00000003`表示包体长度为`3字节`,`{ 0x61, 0x62 0x63 }`为包体。 ``` { 0x03, 0x00, 0x00, 0x00, 0x61, 0x62, 0x63 } ``` `FixedHeaderDataReceiveAdapter`专为这种结构设计 子类继承`FixedHeaderDataReceiveAdapter` 在自身的`构造函数`中调用父类构造函数, 传入`包头长度`和`最大允许的封包长度` 覆盖`GetBodySize()`方法, 其参数`header`的长度为构造函数中指定的包头长度, 需用户解析这个参数, 返回实际的`body`长度 覆盖`ParseRequestBody()`方法, 将当前的`bytes`反序列化为泛型类型(``)对象 ```cs using System; using System.Text; using HPSocket.Adapter; using Models; using Newtonsoft.Json; namespace TcpServerTestEchoAdapter.DataReceiveAdapter { /// /// 固定包头数据接收适配器 /// public class PacketDataReceiveAdapter : FixedHeaderDataReceiveAdapter { /// /// 调用父类构造函数,指定固定包头的长度及最大封包长度 /// public PacketDataReceiveAdapter() : base( headerSize: 4, // 这里指定4字节包头 maxPacketSize: 0x1000 // 这里指定最大封包长度不能超过4K ) { } /// /// 获取请求体长度 /// 子类必须覆盖此方法 /// /// 包头,header的长度是构造函数里指定的长度,当接收到了指定长度的包头再调用此方法 /// 返回包体长度 protected override int GetBodySize(byte[] header) { // 根据业务场景来适配字节序, 两端字节序要保持一致 // 如果当前环境不是小端字节序 if (!BitConverter.IsLittleEndian) { // 转换为小端字节序 Array.Reverse(header); } // 因为包头是4字节,所以直接转int并返回 return BitConverter.ToInt32(header, 0); } /// /// 解析请求体 /// 子类必须覆盖此方法 /// /// 包头 /// 包体 /// protected override Packet ParseRequestBody(byte[] header, byte[] data) { // 将data反序列化为对象 // 这里是Packet类的对象 return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(data)); } } } ``` #### 2. `FixedSizeDataReceiveAdapter` 定长包数据接收适配器 包长度固定,每个包都是同样大小,使用这种适配器 `FixedSizeDataReceiveAdapter`专为这种结构设计 ```cs using HPSocket.Adapter; namespace TcpServerTestEchoAdapter.DataReceiveAdapter { /// /// 定长包数据接收适配器 /// public class BinaryDataReceiveAdapter : FixedSizeDataReceiveAdapter { /// /// 调用父类构造函数,指定定长包长度 /// public BinaryDataReceiveAdapter() : base( packetSize: 1024 // 定长包包长1K字节 ) { } /// /// 解析请求体 /// 子类必须覆盖此方法 /// /// 父类处理好的定长数据 /// protected override byte[] ParseRequestBody(byte[] data) { // 因为继承自FixedSizeDataReceiveAdapter,所以这里直接返回了,如果是其他类型请做完转换工作再返回 return data; } } } ``` #### 3. `TerminatorDataReceiveAdapter` 结束符数据接收适配器 包头无特征, 包尾使用特定标志作为结束符,使用这种适配器 示例:下面这种包结构以`\r\n`结尾 ``` hello world 1\r\n hello world 2\r\n hello world 3\r\n ``` `TerminatorDataReceiveAdapter`专为这种结构设计 ```cs using System.Text; using HPSocket.Adapter; namespace TcpServerTestEchoAdapter.DataReceiveAdapter { /// /// 结束符数据接收适配器 /// public class TextDataReceiveAdapter : TerminatorDataReceiveAdapter { /// /// 调用父类构造函数,指定结束符 /// public TextDataReceiveAdapter() : base( terminator: Encoding.UTF8.GetBytes("\r\n") // 指定结束符为\r\n,也就是说每条数据以\r\n结尾,注意编码问题,要两端保持一致 ) { } /// /// 解析请求体 /// 子类必须覆盖此方法 /// /// 父类已经处理好的不含结束符的数据 /// protected override string ParseRequestBody(byte[] data) { // 转换成请求对象, 注意字符编码,要两端保持一致 return Encoding.UTF8.GetString(data); } } } ``` #### 4. `BetweenAndDataReceiveAdapter` 区间数据接收适配器 包头包尾都指定特征符号, 使用这种适配器 示例:数据包头以某特征符号开始,包尾以其它某特征符号结束 ``` ##hello world!## // ##开头,##结尾 ``` 或 ``` ##hello world!|| // ##开头,||结尾 ``` 或 ``` **hello world!|##| // **开头,|##|结尾 ``` `BetweenAndDataReceiveAdapter`专为这种结构设计 ```cs using System.Text; using HPSocket.Adapter; namespace TcpServerTestEchoAdapter.DataReceiveAdapter { /// /// 区间数据接收适配器 /// public class HeadTailDataReceiveAdapter : BetweenAndDataReceiveAdapter { /// /// 调用父类构造函数,指定区间开始和结束特征字符 /// public HeadTailDataReceiveAdapter() : base( // 例如数据格式是"#*123456*#",其中以#*开头,以*#结尾,中间123456部分是真实数据 start : Encoding.UTF8.GetBytes("#*"), // 区间起始标志,这里以#*开始,注意编码问题,要两端保持一致 end : Encoding.UTF8.GetBytes("*#") // 区间结束标志,这里以*#结束,注意编码问题,要两端保持一致 ) { } /// /// 解析请求体 /// 子类必须覆盖此方法 /// /// 父类已处理好的不含区间起始标识符的数据 /// protected override string ParseRequestBody(byte[] data) { // 转换成请求对象,注意编码问题,要两端保持一致 return Encoding.UTF8.GetString(data); } } } ``` ## 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request

近期下载者

相关文件


收藏者