mirror of
https://github.com/RRQM/TouchSocket.git
synced 2025-12-17 17:06:45 +08:00
发布:3.0.15
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<Version>3.0.14</Version>
|
||||
<Version>3.0.15</Version>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Company>若汝棋茗</Company>
|
||||
<Copyright>Copyright © 2024 若汝棋茗</Copyright>
|
||||
<Copyright>Copyright © 2025 若汝棋茗</Copyright>
|
||||
<PackageProjectUrl>https://touchsocket.net/</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/RRQM/TouchSocket</RepositoryUrl>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
@@ -92,4 +92,12 @@
|
||||
<Using Condition="!$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net9.0'))" Alias="Lock" Include="Backport.System.Threading.Lock" />
|
||||
<Using Alias="LockFactory" Include="Backport.System.Threading.LockFactory" />
|
||||
</ItemGroup>-->
|
||||
|
||||
<PropertyGroup Condition="'$(IsSourceGenerator)'!='True'">
|
||||
<PackageReadmeFile>Readme.md</PackageReadmeFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition="'$(IsSourceGenerator)'!='True'">
|
||||
<None Include="Readme.md" Pack="true" PackagePath="\"/>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
19
src/TouchSocket.AspNetCore/Readme.md
Normal file
19
src/TouchSocket.AspNetCore/Readme.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# TouchSocket.AspNetCore
|
||||
|
||||
## 简介
|
||||
TouchSocket.AspNetCore是TouchSocket的一个扩展包,提供了基于Asp.Net Core的WebApi服务。
|
||||
|
||||
## 功能特性
|
||||
- 提供了基于Asp.Net Core的WebApi服务。
|
||||
- 提供了基于Asp.Net Core的Dmtp服务。
|
||||
- 提供了基于Asp.Net Core的WebSocket服务。
|
||||
- 提供了基于Asp.Net Core的Http服务。
|
||||
|
||||
## 支持的目标框架
|
||||
- net6.0
|
||||
- net8.0
|
||||
- net9.0
|
||||
|
||||
## 使用方法
|
||||
|
||||
请参阅[说明文档(https://touchsocket.net/)](https://touchsocket.net/)
|
||||
25
src/TouchSocket.Core.Autofac/Readme.md
Normal file
25
src/TouchSocket.Core.Autofac/Readme.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# TouchSocket.Core.Autofac
|
||||
|
||||
## 简介
|
||||
这是一个为Core中扩展Ioc容器为Autofac的库。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- 一键式注册
|
||||
- 支持单例、瞬时、作用域三种生命周期
|
||||
|
||||
|
||||
## 支持的目标框架
|
||||
|
||||
- net462
|
||||
- net472
|
||||
- net481
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 使用方法
|
||||
|
||||
请参阅[说明文档(https://touchsocket.net/)](https://touchsocket.net/)
|
||||
25
src/TouchSocket.Core.DependencyInjection/Readme.md
Normal file
25
src/TouchSocket.Core.DependencyInjection/Readme.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# TouchSocket.Core.DependencyInjection
|
||||
|
||||
## 简介
|
||||
这是一个为Core中扩展Ioc容器为IServiceCollection的库。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- 一键式注册
|
||||
- 支持单例、瞬时、作用域三种生命周期
|
||||
|
||||
|
||||
## 支持的目标框架
|
||||
|
||||
- net462
|
||||
- net472
|
||||
- net481
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 使用方法
|
||||
|
||||
请参阅[说明文档(https://touchsocket.net/)](https://touchsocket.net/)
|
||||
@@ -47,8 +47,8 @@ public abstract class CustomBetweenAndDataHandlingAdapter<TBetweenAndRequestInfo
|
||||
/// <returns></returns>
|
||||
protected override FilterResult Filter<T>(ref T byteBlock, bool beCached, ref TBetweenAndRequestInfo request, ref int tempCapacity)
|
||||
{
|
||||
ReadOnlySpan<byte> startCode = this.StartCode ?? ReadOnlySpan<byte>.Empty;
|
||||
ReadOnlySpan<byte> endCode = this.EndCode ?? ReadOnlySpan<byte>.Empty;
|
||||
var startCode = this.StartCode ?? ReadOnlySpan<byte>.Empty;
|
||||
var endCode = this.EndCode ?? ReadOnlySpan<byte>.Empty;
|
||||
// 检查终止字符是否为空
|
||||
if (endCode.IsEmpty)
|
||||
{
|
||||
@@ -106,7 +106,7 @@ public abstract class CustomBetweenAndDataHandlingAdapter<TBetweenAndRequestInfo
|
||||
/// <summary>
|
||||
/// 区间类型的适配器数据模型接口。
|
||||
/// </summary>
|
||||
[Obsolete("此接口已被弃用,请使用IRequestInfo代替约束。具体数据会在CustomBetweenAndDataHandlingAdapter.GetInstance(ReadOnlySpan<byte> body)直接投递。",true)]
|
||||
[Obsolete("此接口已被弃用,请使用IRequestInfo代替约束。具体数据会在CustomBetweenAndDataHandlingAdapter.GetInstance(ReadOnlySpan<byte> body)直接投递。", true)]
|
||||
public interface IBetweenAndRequestInfo : IRequestInfo
|
||||
{
|
||||
/// <summary>
|
||||
|
||||
@@ -893,5 +893,43 @@ public static class SystemExtension
|
||||
|
||||
return enumerator;
|
||||
}
|
||||
/// <summary>
|
||||
/// 读取流中的所有字节并返回字节数组。
|
||||
/// </summary>
|
||||
/// <param name="stream">要读取的流。</param>
|
||||
/// <returns>包含流中所有字节的字节数组。</returns>
|
||||
/// <exception cref="ArgumentNullException">当输入的流为 null 时抛出。</exception>
|
||||
/// <exception cref="IOException">当读取的字节数与流的长度不匹配时抛出。</exception>
|
||||
public static byte[] ReadAllToByteArray(this Stream stream)
|
||||
{
|
||||
if (stream == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(stream), "输入的 Stream 不能为 null。");
|
||||
}
|
||||
|
||||
// 如果流支持长度属性,并且流的位置在起始位置,可以直接创建对应长度的数组
|
||||
if (stream.CanSeek && stream.Length > 0 && stream.Position == 0)
|
||||
{
|
||||
var buffer = new byte[stream.Length];
|
||||
var bytesRead = stream.Read(buffer, 0, buffer.Length);
|
||||
if (bytesRead != buffer.Length)
|
||||
{
|
||||
throw new IOException("读取的字节数与流的长度不匹配。");
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// 如果流不支持长度属性或位置不在起始位置,使用 MemoryStream 来读取数据
|
||||
using (var memoryStream = new MemoryStream())
|
||||
{
|
||||
var buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
|
||||
{
|
||||
memoryStream.Write(buffer, 0, bytesRead);
|
||||
}
|
||||
return memoryStream.ToArray();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
45
src/TouchSocket.Core/Readme.md
Normal file
45
src/TouchSocket.Core/Readme.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# TouchSocket.Core
|
||||
|
||||
## 简介
|
||||
这是一个基础服务功能的库,其中包含:内存池、对象池、文件池、流式数据解包器、等待逻辑池、AppMessenger、3DES加密、Xml快速存储、运行时间测量器、文件快捷操作、高性能二进制序列化器、规范日志接口等。
|
||||
|
||||
## 功能特性
|
||||
### 1. 内存与对象管理
|
||||
- **内存池**:高效管理内存资源,减少内存分配与回收开销,提升系统性能。
|
||||
- **对象池**:复用对象实例,避免频繁创建和销毁对象带来的性能损耗。
|
||||
|
||||
### 2. 文件管理
|
||||
- **文件池**:优化文件资源使用,提高文件操作效率。
|
||||
- **文件快捷操作**:提供便捷的文件读写、复制、移动等操作方法。
|
||||
|
||||
### 3. 数据处理
|
||||
- **流式数据解包器**:高效解包流式数据,便于数据处理和解析。
|
||||
- **高性能二进制序列化器**:实现快速、高效的二进制数据序列化和反序列化。
|
||||
|
||||
### 4. 逻辑处理
|
||||
- **等待逻辑池**:管理等待逻辑,提高异步操作处理效率。
|
||||
- **AppMessenger**:实现应用内消息传递机制,方便模块间通信。
|
||||
|
||||
### 5. 加密与存储
|
||||
- **3DES 加密**:提供 3DES 加密算法,保障数据安全性。
|
||||
- **Xml 快速存储**:实现 XML 数据的快速存储和读取。
|
||||
|
||||
### 6. 性能监测与日志
|
||||
- **运行时间测量器**:测量代码块运行时间,助力性能优化。
|
||||
- **规范日志接口**:提供统一的日志记录接口,方便日志管理。
|
||||
|
||||
## 支持的目标框架
|
||||
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- net481
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 使用方法
|
||||
|
||||
请参阅[说明文档(https://touchsocket.net/)](https://touchsocket.net/)
|
||||
@@ -1,8 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
// ------------------------------------------------------------------------------
|
||||
// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有
|
||||
// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权
|
||||
// CSDN博客:https://blog.csdn.net/qq_40374647
|
||||
// 哔哩哔哩视频:https://space.bilibili.com/94253567
|
||||
// Gitee源代码仓库:https://gitee.com/RRQM_Home
|
||||
// Github源代码仓库:https://github.com/RRQM
|
||||
// API首页:https://touchsocket.net/
|
||||
// 交流QQ群:234762506
|
||||
// 感谢您的下载和使用
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
namespace TouchSocket.Core;
|
||||
|
||||
|
||||
@@ -33,6 +33,6 @@ public sealed class TokenVerifyException : Exception
|
||||
/// <param name="message">描述错误的消息。</param>
|
||||
public TokenVerifyException(Metadata metadata, string message) : base(message)
|
||||
{
|
||||
Metadata = metadata;
|
||||
this.Metadata = metadata;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ public interface IFileResourceController : IDisposable
|
||||
/// <param name="resourceHandle">资源句柄,标识需要释放的文件资源定位器</param>
|
||||
/// <param name="locator">输出参数,返回被释放的文件资源定位器</param>
|
||||
/// <returns>如果成功释放文件资源定位器,则返回true;否则返回false</returns>
|
||||
public bool TryReleaseFileResourceLocator(int resourceHandle, out FileResourceLocator locator);
|
||||
bool TryReleaseFileResourceLocator(int resourceHandle, out FileResourceLocator locator);
|
||||
|
||||
/// <summary>
|
||||
/// 通过文件句柄,获取资源定位器。
|
||||
|
||||
@@ -48,7 +48,7 @@ public interface IDmtpRedisActor : ICacheAsync<string, byte[]>, IActor
|
||||
/// <exception cref="ArgumentNullException">如果键或值为null,则抛出该异常。</exception>
|
||||
/// <exception cref="TimeoutException">如果异步操作超时,则抛出该异常。</exception>
|
||||
/// <exception cref="Exception">如果发生其他异常,则抛出该异常。</exception>
|
||||
public Task<bool> AddAsync<TValue>(string key, TValue value, int duration = 60000);
|
||||
Task<bool> AddAsync<TValue>(string key, TValue value, int duration = 60000);
|
||||
|
||||
/// <summary>
|
||||
/// 异步获取缓存的键值对。
|
||||
@@ -59,7 +59,7 @@ public interface IDmtpRedisActor : ICacheAsync<string, byte[]>, IActor
|
||||
/// <exception cref="ArgumentNullException">如果 <paramref name="key"/> 为空或为 null,则抛出此异常。</exception>
|
||||
/// <exception cref="TimeoutException">如果获取操作超时,则抛出此异常。</exception>
|
||||
/// <exception cref="Exception">如果发生其他异常,则抛出此异常。</exception>
|
||||
public Task<TValue> GetAsync<TValue>(string key);
|
||||
Task<TValue> GetAsync<TValue>(string key);
|
||||
|
||||
/// <summary>
|
||||
/// 设置缓存值
|
||||
@@ -73,5 +73,5 @@ public interface IDmtpRedisActor : ICacheAsync<string, byte[]>, IActor
|
||||
/// <exception cref="ArgumentNullException">当参数为空时抛出</exception>
|
||||
/// <exception cref="TimeoutException">当操作超时时抛出</exception>
|
||||
/// <exception cref="Exception">当发生其他异常时抛出</exception>
|
||||
public Task<bool> SetAsync<TValue>(string key, TValue value, int duration = 60000);
|
||||
Task<bool> SetAsync<TValue>(string key, TValue value, int duration = 60000);
|
||||
}
|
||||
@@ -23,7 +23,7 @@ public interface IDmtpRpcCallContext : ICallContext
|
||||
/// <summary>
|
||||
/// 序列化类型
|
||||
/// </summary>
|
||||
public SerializationType SerializationType { get; }
|
||||
SerializationType SerializationType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 调用元数据
|
||||
|
||||
23
src/TouchSocket.Dmtp/Readme.md
Normal file
23
src/TouchSocket.Dmtp/Readme.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# TouchSocket.Dmtp
|
||||
|
||||
## 简介
|
||||
DMTP(Duplex Message Transport Protocol 双工消息传输协议)是一个简单易用、便捷高效,且易于扩展的二进制数据协议。目前基于该协议,已实现的功能包括:连接验证、同步 Id、Rpc(包括客户端请求服务器,服务器请求客户端、客户端请求客户端)、文件传输(包括客户端向服务器请求文件、客户端向服务器推送文件、服务器向客户端请求文件、服务器向客户端推送文件、客户端之间请求、推送文件)、Redis 等。
|
||||
|
||||
## 功能特性
|
||||
- **双工通信**:支持客户端与服务器、客户端与客户端之间的双工消息传输,实现高效的数据交互。
|
||||
- **丰富的功能集**:涵盖连接验证、同步 Id、Rpc 调用、文件传输、Redis 集成等多种实用功能。
|
||||
- **易于扩展**:协议设计灵活,方便开发者根据需求进行功能扩展和定制。
|
||||
|
||||
## 支持的目标框架
|
||||
- net462
|
||||
- net472
|
||||
- net481
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 使用方法
|
||||
|
||||
请参阅[说明文档(https://touchsocket.net/)](https://touchsocket.net/)
|
||||
17
src/TouchSocket.Hosting/Readme.md
Normal file
17
src/TouchSocket.Hosting/Readme.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# TouchSocket.Hosting
|
||||
|
||||
## 概述
|
||||
TouchSocket.Hosting 是 TouchSocket 基于通用主机的扩展项目,提供了 Tcp、Udp、NamedPipe、Dmtp、SerialPort 等服务的支持。借助该项目,开发者能够更便捷地将这些网络服务集成到基于通用主机的应用程序中。
|
||||
|
||||
## 支持的目标框架
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 使用方法
|
||||
|
||||
请参阅[说明文档(https://touchsocket.net/)](https://touchsocket.net/)
|
||||
@@ -33,12 +33,12 @@ public interface IFormFile
|
||||
/// <summary>
|
||||
/// 实际的数据
|
||||
/// </summary>
|
||||
public ReadOnlyMemory<byte> Data { get; }
|
||||
ReadOnlyMemory<byte> Data { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据对
|
||||
/// </summary>
|
||||
public NameValueCollection DataPair { get; }
|
||||
NameValueCollection DataPair { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取file name
|
||||
|
||||
34
src/TouchSocket.Http/Readme.md
Normal file
34
src/TouchSocket.Http/Readme.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# TouchSocket.Http
|
||||
|
||||
## 项目简介
|
||||
TouchSocket.Http 是一个基于 Http1.1 协议的组件库,为开发者提供了丰富且强大的 Http 相关功能。它集成了 Http 服务器、客户端以及 WebSocket 组件,能够满足多种复杂场景下的网络通信需求。
|
||||
|
||||
## 功能特性
|
||||
### 1. 数据传输功能
|
||||
- **大文件处理**:支持大文件的下载与上传操作,并且实现了多线程下载和断点续传功能。这意味着在处理大文件时,不仅可以提高传输效率,还能在网络中断等异常情况下恢复传输,确保数据完整性。
|
||||
- **小文件上传**:提供小文件 form 上传功能,方便用户通过表单形式上传小型文件。
|
||||
|
||||
### 2. WebApi 支持
|
||||
- **声明与执行**:允许开发者声明和执行 WebApi,简化了与 Web 服务的交互过程,提高了开发效率。
|
||||
|
||||
### 3. 客户端特性
|
||||
- **基于连接的客户端**:所提供的 Http 客户端是基于连接的,能够捕获连接和断开连接等消息。这使得开发者可以更好地监控客户端的状态,及时处理连接异常情况。
|
||||
|
||||
### 4. WebSocket 支持
|
||||
- **WebSocket 组件**:集成了 WebSocket 组件,支持 WebSocket 协议,可实现实时双向通信,适用于需要实时数据交互的场景,如在线聊天、实时监控等。
|
||||
|
||||
|
||||
## 支持的目标框架
|
||||
- net481
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 使用方法
|
||||
|
||||
请参阅[说明文档(https://touchsocket.net/)](https://touchsocket.net/)
|
||||
@@ -12,8 +12,18 @@
|
||||
|
||||
namespace TouchSocket.JsonRpc;
|
||||
|
||||
/// <summary>
|
||||
/// 表示 JSON-RPC 消息的基类。
|
||||
/// </summary>
|
||||
public class JsonRpcBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取或设置 JSON-RPC 消息的标识符。
|
||||
/// </summary>
|
||||
public int? Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置 JSON-RPC 版本。
|
||||
/// </summary>
|
||||
public string Jsonrpc { get; set; } = "2.0";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ public abstract class JsonRpcCallContextBase : CallContext, IJsonRpcCallContext
|
||||
{
|
||||
private IScopedResolver m_scopedResolver;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public int? JsonRpcId { get; protected set; }
|
||||
|
||||
///// <summary>
|
||||
|
||||
@@ -20,12 +20,15 @@ using TouchSocket.Rpc;
|
||||
namespace TouchSocket.JsonRpc;
|
||||
|
||||
/// <summary>
|
||||
/// 基于Http协议的JsonRpc客户端
|
||||
/// 表示一个HTTP JSON-RPC客户端。
|
||||
/// </summary>
|
||||
public class HttpJsonRpcClient : HttpClientBase, IHttpJsonRpcClient
|
||||
{
|
||||
private readonly JsonRpcActor m_jsonRpcActor;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化 <see cref="HttpJsonRpcClient"/> 类的新实例。
|
||||
/// </summary>
|
||||
public HttpJsonRpcClient()
|
||||
{
|
||||
this.SerializerConverter.Add(new JsonStringToClassSerializerFormatter<JsonRpcActor>());
|
||||
@@ -36,6 +39,9 @@ public class HttpJsonRpcClient : HttpClientBase, IHttpJsonRpcClient
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取序列化转换器。
|
||||
/// </summary>
|
||||
public TouchSocketSerializerConverter<string, JsonRpcActor> SerializerConverter { get; } = new TouchSocketSerializerConverter<string, JsonRpcActor>();
|
||||
|
||||
#region JsonRpcActor
|
||||
@@ -60,22 +66,37 @@ public class HttpJsonRpcClient : HttpClientBase, IHttpJsonRpcClient
|
||||
|
||||
#endregion JsonRpcActor
|
||||
|
||||
/// <inheritdoc/>
|
||||
/// <summary>
|
||||
/// 异步连接到服务器。
|
||||
/// </summary>
|
||||
/// <param name="millisecondsTimeout">超时时间(毫秒)。</param>
|
||||
/// <param name="token">取消令牌。</param>
|
||||
/// <returns>表示异步操作的任务。</returns>
|
||||
public Task ConnectAsync(int millisecondsTimeout, CancellationToken token)
|
||||
{
|
||||
return this.TcpConnectAsync(millisecondsTimeout, token);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
/// <summary>
|
||||
/// 异步调用远程方法。
|
||||
/// </summary>
|
||||
/// <param name="invokeKey">调用键。</param>
|
||||
/// <param name="returnType">返回类型。</param>
|
||||
/// <param name="invokeOption">调用选项。</param>
|
||||
/// <param name="parameters">参数。</param>
|
||||
/// <returns>表示异步操作的任务,包含调用结果。</returns>
|
||||
public Task<object> InvokeAsync(string invokeKey, Type returnType, IInvokeOption invokeOption, params object[] parameters)
|
||||
{
|
||||
return this.m_jsonRpcActor.InvokeAsync(invokeKey, returnType, invokeOption, parameters);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
/// <summary>
|
||||
/// 加载配置。
|
||||
/// </summary>
|
||||
/// <param name="config">配置。</param>
|
||||
protected override void LoadConfig(TouchSocketConfig config)
|
||||
{
|
||||
base.LoadConfig(config);
|
||||
this.m_jsonRpcActor.Logger = this.Logger;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,12 +20,15 @@ using TouchSocket.Sockets;
|
||||
namespace TouchSocket.JsonRpc;
|
||||
|
||||
/// <summary>
|
||||
/// 基于Tcp协议的TcpJsonRpc客户端
|
||||
/// 表示一个TCP JsonRpc客户端。
|
||||
/// </summary>
|
||||
public class TcpJsonRpcClient : TcpClientBase, ITcpJsonRpcClient
|
||||
{
|
||||
private readonly JsonRpcActor m_jsonRpcActor;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化 <see cref="TcpJsonRpcClient"/> 类的新实例。
|
||||
/// </summary>
|
||||
public TcpJsonRpcClient()
|
||||
{
|
||||
this.SerializerConverter.Add(new JsonStringToClassSerializerFormatter<JsonRpcActor>());
|
||||
@@ -46,10 +49,11 @@ public class TcpJsonRpcClient : TcpClientBase, ITcpJsonRpcClient
|
||||
#endregion JsonRpcActor
|
||||
|
||||
/// <summary>
|
||||
/// JsonRpc的调用键。
|
||||
/// 获取JsonRpc的调用键。
|
||||
/// </summary>
|
||||
public ActionMap ActionMap => this.m_jsonRpcActor.ActionMap;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public TouchSocketSerializerConverter<string, JsonRpcActor> SerializerConverter { get; } = new TouchSocketSerializerConverter<string, JsonRpcActor>();
|
||||
|
||||
/// <inheritdoc/>
|
||||
@@ -103,4 +107,4 @@ public class TcpJsonRpcClient : TcpClientBase, ITcpJsonRpcClient
|
||||
|
||||
await base.OnTcpReceived(e).ConfigureAwait(EasyTask.ContinueOnCapturedContext);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
26
src/TouchSocket.JsonRpc/Readme.md
Normal file
26
src/TouchSocket.JsonRpc/Readme.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# TouchSocket.JsonRpc
|
||||
|
||||
## 项目概述
|
||||
TouchSocket.JsonRpc 是一个提供 JsonRpc 服务器和客户端的组件库。借助该组件,开发者能够创建基于 Tcp、Http、WebSocket 协议的 JsonRpc 服务器和客户端,全面支持 JsonRpc 的各项功能,并且可与 Web、Android 等平台实现无缝对接。
|
||||
|
||||
## 功能特性
|
||||
- **多协议支持**:支持 Tcp、Http、WebSocket 协议,满足不同场景下的通信需求。
|
||||
- **全功能支持**:涵盖 JsonRpc 的所有功能,为开发者提供完整的 JsonRpc 解决方案。
|
||||
- **跨平台对接**:可与 Web、Android 等多种平台进行无缝对接,方便构建跨平台应用。
|
||||
|
||||
## 文档说明
|
||||
详细的说明文档请访问:[https://touchsocket.net/](https://touchsocket.net/)
|
||||
|
||||
## 支持的目标框架
|
||||
- net481
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 贡献与反馈
|
||||
如果你在使用过程中遇到问题或有任何建议,欢迎提交 issue 或参与项目贡献。
|
||||
23
src/TouchSocket.Modbus/Readme.md
Normal file
23
src/TouchSocket.Modbus/Readme.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# TouchSocket.Modbus
|
||||
|
||||
## 项目概述
|
||||
TouchSocket.Modbus 是一个 Modbus 功能库,为开发者提供了多种 Modbus 主站功能,可用于与 Modbus 从站设备进行通信。
|
||||
|
||||
## 功能特性
|
||||
- **多种主站类型支持**:目前包括 ModbusTcpMaster、ModbusUdpMaster、ModbusRtuMaster、ModbusRtuOverTcpMaster、ModbusRtuOverUdpMaster,满足不同场景下的 Modbus 通信需求。
|
||||
|
||||
## 文档说明
|
||||
详细的说明文档请访问:[https://touchsocket.net/](https://touchsocket.net/)
|
||||
|
||||
## 支持的目标框架
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 贡献与反馈
|
||||
如果你在使用过程中遇到问题或有任何建议,欢迎提交 issue 或参与项目贡献。
|
||||
@@ -22,5 +22,5 @@ public interface INamedPipeStreamClient
|
||||
/// <summary>
|
||||
/// 用于通讯的管道流。
|
||||
/// </summary>
|
||||
public PipeStream PipeStream { get; }
|
||||
PipeStream PipeStream { get; }
|
||||
}
|
||||
26
src/TouchSocket.NamedPipe/Readme.md
Normal file
26
src/TouchSocket.NamedPipe/Readme.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# TouchSocket.NamedPipe
|
||||
|
||||
## 项目概述
|
||||
TouchSocket.NamedPipe 是一个基于命名管道的组件库。它模仿 Tcp 封装了命名管道的服务器和客户端,以及连接、断开连接等消息,让开发者能以极致接近 Tcp 的体验使用命名管道。
|
||||
|
||||
## 功能特性
|
||||
- **Tcp 风格体验**:提供与 Tcp 相似的使用方式,降低开发者学习成本。
|
||||
- **多管道名称监听**:支持同时监听多个管道名称,增强应用的灵活性。
|
||||
- **流式数据解析**:高效处理流式数据,确保数据传输的准确性和稳定性。
|
||||
|
||||
## 文档说明
|
||||
详细的说明文档请访问:[https://touchsocket.net/](https://touchsocket.net/)
|
||||
|
||||
## 支持的目标框架
|
||||
- net481
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 贡献与反馈
|
||||
如果你在使用过程中遇到问题或有任何建议,欢迎提交 issue 或参与项目贡献。
|
||||
23
src/TouchSocket.Rpc.RateLimiting/Readme.md
Normal file
23
src/TouchSocket.Rpc.RateLimiting/Readme.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# TouchSocket.Rpc.RateLimiting
|
||||
|
||||
## 项目概述
|
||||
TouchSocket.Rpc.RateLimiting 是一个扩展于 Rpc 管理平台的限流包。它为 Rpc 调用提供了限流功能,可有效控制 Rpc 请求的频率,避免系统因过载而出现性能问题。目前,该包支持开发 DmtpRpc、XmlRpc、JsonRpc、WebApi 等所有 Rpc 部分。
|
||||
|
||||
## 功能特性
|
||||
- **限流支持**:为各类 Rpc 调用提供限流机制,确保系统在高并发情况下的稳定性。
|
||||
- **多 Rpc 类型兼容**:支持 DmtpRpc、XmlRpc、JsonRpc、WebApi 等多种 Rpc 类型,具有广泛的适用性。
|
||||
|
||||
## 文档说明
|
||||
详细的说明文档请访问:[https://touchsocket.net/](https://touchsocket.net/)
|
||||
|
||||
## 支持的目标框架
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 贡献与反馈
|
||||
如果你在使用过程中遇到问题或有任何建议,欢迎提交 issue 或参与项目贡献。
|
||||
26
src/TouchSocket.Rpc/Readme.md
Normal file
26
src/TouchSocket.Rpc/Readme.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# TouchSocket.Rpc
|
||||
|
||||
## 项目概述
|
||||
TouchSocket.Rpc 是一个超轻量、高性能、可扩展的 Rpc 管理平台框架。借助该框架,开发者能够快速开发出 Rpc 执行功能。目前,已在此基础上扩展开发了 DmtpRpc、XmlRpc、JsonRpc、WebApi 等部分。
|
||||
|
||||
## 功能特性
|
||||
- **轻量高效**:框架设计简洁,资源占用少,能实现高效的 Rpc 调用。
|
||||
- **可扩展性强**:方便开发者根据需求扩展新的 Rpc 类型和功能。
|
||||
- **多类型支持**:支持 DmtpRpc、XmlRpc、JsonRpc、WebApi 等多种 Rpc 类型。
|
||||
|
||||
## 文档说明
|
||||
详细的说明文档请访问:[https://touchsocket.net/](https://touchsocket.net/)
|
||||
|
||||
## 支持的目标框架
|
||||
- net481
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 贡献与反馈
|
||||
如果你在使用过程中遇到问题或有任何建议,欢迎提交 issue 或参与项目贡献。
|
||||
26
src/TouchSocket.SerialPorts/Readme.md
Normal file
26
src/TouchSocket.SerialPorts/Readme.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# TouchSocket.SerialPorts
|
||||
|
||||
## 项目概述
|
||||
TouchSocket.SerialPorts 是一个适用于 .Net(涵盖 C#、VB.Net、F#)的整合性串口通信框架。它提供了丰富的串口通信功能,包括串口连接、断开等一系列通信事务处理,同时能一键式解决数据黏分包问题。借助协议模板,可快速实现「固定包头」「固定长度」「区间字符」等多种数据报文解析。
|
||||
|
||||
## 功能特性
|
||||
- **全面的串口通信支持**:支持串口的连接、断开等基本操作,满足常见的串口通信需求。
|
||||
- **数据黏分包处理**:能够自动处理数据黏分包问题,确保数据的准确传输。
|
||||
- **灵活的报文解析**:通过协议模板,可快速实现多种数据报文解析方式。
|
||||
|
||||
## 文档说明
|
||||
详细的说明文档请访问:[https://touchsocket.net/](https://touchsocket.net/)
|
||||
|
||||
## 支持的目标框架
|
||||
- net481
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 贡献与反馈
|
||||
如果你在使用过程中遇到问题或有任何建议,欢迎提交 issue 或参与项目贡献。
|
||||
@@ -76,8 +76,7 @@ public sealed class SwaggerPlugin : PluginBase, IServerStartedPlugin, IHttpPlugi
|
||||
{
|
||||
using (var stream = assembly.GetManifestResourceStream(item))
|
||||
{
|
||||
var bytes = new byte[stream.Length];
|
||||
stream.Read(bytes, 0, bytes.Length);
|
||||
var bytes = stream.ReadAllToByteArray();
|
||||
var prefix = this.Prefix.IsNullOrEmpty() ? "/" : (this.Prefix.StartsWith("/") ? this.Prefix : $"/{this.Prefix}");
|
||||
var name = item.Replace("TouchSocket.WebApi.Swagger.api.", string.Empty);
|
||||
if (name == "openapi.json")
|
||||
|
||||
25
src/TouchSocket.WebApi.Swagger/Readme.md
Normal file
25
src/TouchSocket.WebApi.Swagger/Readme.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# TouchSocket.WebApi.Swagger
|
||||
|
||||
## 项目概述
|
||||
TouchSocket.WebApi.Swagger 是适用于 TouchSocket.WebApi 的 Swagger 页面组件库。借助该组件,开发者可直接在浏览器中调试 WebApi,极大地提升了开发和测试效率。
|
||||
|
||||
## 功能特性
|
||||
- **WebApi 调试**:提供可视化界面,支持在浏览器中直接调试 TouchSocket.WebApi。
|
||||
- **资源嵌入**:将 Swagger 相关的静态资源(如 HTML、CSS、JavaScript 文件等)嵌入到项目中,方便部署和使用。
|
||||
|
||||
## 文档说明
|
||||
详细的说明文档请访问:[https://touchsocket.net/](https://touchsocket.net/)
|
||||
|
||||
## 支持的目标框架
|
||||
- net481
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 贡献与反馈
|
||||
如果你在使用过程中遇到问题或有任何建议,欢迎提交 issue 或参与项目贡献。
|
||||
@@ -154,7 +154,7 @@ public sealed class WebApiAttribute : RpcAttribute
|
||||
return codeString.ToString();
|
||||
}
|
||||
|
||||
private string GetParameterToString(RpcParameter parameter)
|
||||
private static string GetParameterToString(RpcParameter parameter)
|
||||
{
|
||||
if (parameter.ParameterInfo.ParameterType.IsValueType)
|
||||
{
|
||||
@@ -167,7 +167,7 @@ public sealed class WebApiAttribute : RpcAttribute
|
||||
private string GetFromHeaderString(RpcMethod rpcMethod, IEnumerable<WebApiParameterInfo> webApiParameterInfos)
|
||||
{
|
||||
var parameterInfos = webApiParameterInfos.Where(a => a.IsFromHeader);
|
||||
var list = parameterInfos.Select(a => $"new KeyValuePair<string, string>(\"{a.FromHeaderName}\",{this.GetParameterToString(a.Parameter)})").ToList();
|
||||
var list = parameterInfos.Select(a => $"new KeyValuePair<string, string>(\"{a.FromHeaderName}\",{GetParameterToString(a.Parameter)})").ToList();
|
||||
|
||||
if (rpcMethod.HasReturn && rpcMethod.ReturnType == typeof(string))
|
||||
{
|
||||
@@ -179,7 +179,7 @@ public sealed class WebApiAttribute : RpcAttribute
|
||||
var codeString = new StringBuilder();
|
||||
codeString.Append("new KeyValuePair<string, string>[] {");
|
||||
codeString.Append(string.Join(",", list));
|
||||
codeString.Append("}");
|
||||
codeString.Append('}');
|
||||
return codeString.ToString();
|
||||
}
|
||||
return "null";
|
||||
@@ -195,8 +195,8 @@ public sealed class WebApiAttribute : RpcAttribute
|
||||
|
||||
var codeString = new StringBuilder();
|
||||
codeString.Append("new KeyValuePair<string, string>[] {");
|
||||
codeString.Append(string.Join(",", parameterInfos.Select(a => $"new KeyValuePair<string, string>(\"{a.FromFormName}\",{this.GetParameterToString(a.Parameter)})")));
|
||||
codeString.Append("}");
|
||||
codeString.Append(string.Join(",", parameterInfos.Select(a => $"new KeyValuePair<string, string>(\"{a.FromFormName}\",{GetParameterToString(a.Parameter)})")));
|
||||
codeString.Append('}');
|
||||
|
||||
return codeString.ToString();
|
||||
}
|
||||
@@ -233,8 +233,8 @@ public sealed class WebApiAttribute : RpcAttribute
|
||||
|
||||
var codeString = new StringBuilder();
|
||||
codeString.Append("new KeyValuePair<string, string>[] {");
|
||||
codeString.Append(string.Join(",", parameterInfos.Select(a => $"new KeyValuePair<string, string>(\"{a.FromQueryName ?? a.Parameter.Name}\",{this.GetParameterToString(a.Parameter)})")));
|
||||
codeString.Append("}");
|
||||
codeString.Append(string.Join(",", parameterInfos.Select(a => $"new KeyValuePair<string, string>(\"{a.FromQueryName ?? a.Parameter.Name}\",{GetParameterToString(a.Parameter)})")));
|
||||
codeString.Append('}');
|
||||
|
||||
return codeString.ToString();
|
||||
}
|
||||
|
||||
26
src/TouchSocket.WebApi/Readme.md
Normal file
26
src/TouchSocket.WebApi/Readme.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# TouchSocket.WebApi
|
||||
|
||||
## 项目概述
|
||||
TouchSocket.WebApi 是一个提供 WebApi 服务器和客户端的组件库。借助该组件,开发者能够创建 WebApi 服务解析器和客户端,实现桌面端、Web 端、移动端的跨语言 Rpc 函数调用。该库支持自定义路由、Get 传参、Post 传参等功能。
|
||||
|
||||
## 功能特性
|
||||
- **跨平台调用**:支持桌面端、Web 端、移动端跨语言调用 Rpc 函数。
|
||||
- **参数传递**:支持 Get 和 Post 两种传参方式。
|
||||
- **自定义路由**:允许开发者自定义 WebApi 路由。
|
||||
|
||||
## 文档说明
|
||||
详细的说明文档请访问:[https://touchsocket.net/](https://touchsocket.net/)
|
||||
|
||||
## 支持的目标框架
|
||||
- net481
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 贡献与反馈
|
||||
如果你在使用过程中遇到问题或有任何建议,欢迎提交 issue 或参与项目贡献。
|
||||
26
src/TouchSocket.XmlRpc/Readme.md
Normal file
26
src/TouchSocket.XmlRpc/Readme.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# TouchSocket.XmlRpc
|
||||
|
||||
## 项目概述
|
||||
TouchSocket.XmlRpc 是一个提供 XmlRpc 服务器和客户端的组件库。借助该组件,开发者能够创建 XmlRpc 服务解析器,完美支持 XmlRpc 数据类型、类型嵌套、数组等特性,并且可与 CookComputing.XmlRpcV2 实现完美对接,不受 Web、Android 等平台限制。
|
||||
|
||||
## 功能特性
|
||||
- **全面的数据类型支持**:支持 XmlRpc 各种数据类型,包括复杂的类型嵌套和数组结构。
|
||||
- **跨平台兼容性**:可在 Web、Android 等多种平台上使用,具有良好的跨平台特性。
|
||||
- **无缝对接**:能与 CookComputing.XmlRpcV2 无缝对接,方便开发者集成现有系统。
|
||||
|
||||
## 文档说明
|
||||
详细的说明文档请访问:[https://touchsocket.net/](https://touchsocket.net/)
|
||||
|
||||
## 支持的目标框架
|
||||
- net481
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 贡献与反馈
|
||||
如果你在使用过程中遇到问题或有任何建议,欢迎提交 issue 或参与项目贡献。
|
||||
@@ -30,7 +30,7 @@ public interface IClientCollection<TClient> : IEnumerable<TClient> where TClient
|
||||
/// </summary>
|
||||
/// <param name="id">客户端的唯一标识符</param>
|
||||
/// <returns>对应的客户端对象,如果找不到则返回null</returns>
|
||||
public TClient this[string id] { get; }
|
||||
TClient this[string id] { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取集合中所有客户端的唯一标识符(Id)
|
||||
|
||||
25
src/TouchSocket/Readme.md
Normal file
25
src/TouchSocket/Readme.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# TouchSocket
|
||||
|
||||
## 简介
|
||||
TouchSocket 是 .Net(包括 C#、VB.Net、F#)的一个整合性的 socket 网络通信框架。它包含了 TCP、UDP、SSL 等一系列的通信模块,能够一键式解决 TCP 黏分包问题、UDP 大数据包分片组合问题等。使用协议模板,可快速实现「固定包头」、「固定长度」、「区间字符」等一系列的数据报文解析。
|
||||
|
||||
## 功能特性
|
||||
- **多协议支持**:支持 TCP、UDP、SSL 等多种通信协议。
|
||||
- **问题解决**:一键解决 TCP 黏分包问题和 UDP 大数据包分片组合问题。
|
||||
- **协议模板**:提供协议模板,可快速实现多种数据报文解析。
|
||||
|
||||
## 支持的目标框架
|
||||
|
||||
- net45
|
||||
- net462
|
||||
- net472
|
||||
- net481
|
||||
- netstandard2.0
|
||||
- netstandard2.1
|
||||
- net6.0
|
||||
- net9.0
|
||||
- net8.0
|
||||
|
||||
## 使用方法
|
||||
|
||||
请参阅[说明文档(https://touchsocket.net/)](https://touchsocket.net/)
|
||||
Reference in New Issue
Block a user