diff --git a/Api/Transmittal/DataRequest.cs b/Api/Transmittal/DataRequest.cs index 580923a..2244a75 100644 --- a/Api/Transmittal/DataRequest.cs +++ b/Api/Transmittal/DataRequest.cs @@ -22,14 +22,10 @@ namespace Milimoe.FunGame.Core.Api.Transmittal /// public string Error => Worker.Error; - /// - /// 获取ResultData中key值对应的Json字符串 - /// -- 此索引器仅返回Json字符串,对象类型请使用反序列化方法GetResult() -- - /// -- 当然也可以自己反序列化 -- - /// -- 基本类型可能有效,但仍建议使用反序列化方法 -- - /// - /// - /// + // 获取ResultData中key值对应的Json字符串 + // -- 此索引器仅返回Json字符串,对象类型请使用反序列化方法GetResult() -- + // -- 当然也可以自己反序列化 -- + // -- 基本类型可能有效,但仍建议使用反序列化方法 -- public object? this[string key] { get diff --git a/Api/Transmittal/SQLHelper.cs b/Api/Transmittal/SQLHelper.cs index f24833f..5c69dc0 100644 --- a/Api/Transmittal/SQLHelper.cs +++ b/Api/Transmittal/SQLHelper.cs @@ -22,7 +22,6 @@ namespace Milimoe.FunGame.Core.Api.Transmittal /// /// 执行一个命令 /// - /// 执行结果 /// 影响的行数 public abstract int Execute(); @@ -30,14 +29,12 @@ namespace Milimoe.FunGame.Core.Api.Transmittal /// 执行一个指定的命令 /// /// 命令 - /// 执行结果 /// 影响的行数 public abstract int Execute(string Script); /// /// 查询DataSet /// - /// 执行结果 /// 结果集 public abstract DataSet ExecuteDataSet(); @@ -45,7 +42,6 @@ namespace Milimoe.FunGame.Core.Api.Transmittal /// 执行指定的命令查询DataSet /// /// 命令 - /// 执行结果 /// 结果集 public abstract DataSet ExecuteDataSet(string Script); diff --git a/Api/Utility/Factory.cs b/Api/Utility/Factory.cs index b509742..fc5ec4f 100644 --- a/Api/Utility/Factory.cs +++ b/Api/Utility/Factory.cs @@ -80,8 +80,8 @@ namespace Milimoe.FunGame.Core.Api.Utility /// /// 通过DataSet获取房间实例 /// - /// - /// + /// + /// /// public static Room GetRoom(DataRow DrRoom, User User) { @@ -222,7 +222,7 @@ namespace Milimoe.FunGame.Core.Api.Utility /// /// 获取用户实例 /// - /// + /// /// public static User GetUser(DataRow dr) { diff --git a/Api/Utility/Implement.cs b/Api/Utility/Implement.cs index f72eae5..f7bd923 100644 --- a/Api/Utility/Implement.cs +++ b/Api/Utility/Implement.cs @@ -4,17 +4,17 @@ using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Api.Utility { /// - /// Interface的定义已经搬至: - /// Milimoe.FunGame.Core.Library.Constant 中的 &InterfaceType 和 &InterfaceSet + /// See: , , /// public class Implement { /// /// 获取FunGame.Implement.dll中接口的实现方法 /// + /// 程序集 /// 接口代号 /// - private static Type? GetFunGameImplementType(System.Reflection.Assembly Assembly, InterfaceType Interface) + private static Type? GetFunGameImplementType(Assembly Assembly, InterfaceType Interface) { // 通过类名获取命名空间+类名称 string ClassName = GetImplementClassName(Interface); diff --git a/Api/Utility/JsonTool.cs b/Api/Utility/JsonTool.cs index 1a71fad..13e5b76 100644 --- a/Api/Utility/JsonTool.cs +++ b/Api/Utility/JsonTool.cs @@ -34,7 +34,7 @@ namespace Milimoe.FunGame.Core.Api.Utility /// /// 注册多个自定义转换器,支持 /// - /// + /// public void AddConverters(IEnumerable converters) { foreach (JsonConverter converter in converters) diff --git a/Api/Utility/TwoFactorAuthenticator.cs b/Api/Utility/TwoFactorAuthenticator.cs index a53a9d5..89aebe8 100644 --- a/Api/Utility/TwoFactorAuthenticator.cs +++ b/Api/Utility/TwoFactorAuthenticator.cs @@ -44,7 +44,6 @@ namespace Milimoe.FunGame.Core.Api.Utility /// /// /// - /// /// public bool Authenticate(string username, string code) { diff --git a/Controller/SocketHandlerController.cs b/Controller/SocketHandlerController.cs index 0715e45..50c6077 100644 --- a/Controller/SocketHandlerController.cs +++ b/Controller/SocketHandlerController.cs @@ -80,7 +80,6 @@ namespace Milimoe.FunGame.Core.Controller /// /// 关闭事件 /// - /// SocketObject protected delegate void DisposedEvent(); /// @@ -93,7 +92,6 @@ namespace Milimoe.FunGame.Core.Controller /// /// 触发关闭事件 /// - /// SocketObject protected void OnDisposed() { Disposed?.Invoke(); diff --git a/FunGame.Core.csproj b/FunGame.Core.csproj index fd949d3..6fb228a 100644 --- a/FunGame.Core.csproj +++ b/FunGame.Core.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable bin\ @@ -14,14 +14,18 @@ Milimoe.$(MSBuildProjectName.Replace(" ", "_")) true $(MSBuildProjectName) + True + docs\api.xml embedded + 1701;1702;CS1591;CS1587 embedded + 1701;1702;CS1591;CS1587 diff --git a/Library/Common/Architecture/AsyncAwaiter.cs b/Library/Common/Architecture/AsyncAwaiter.cs index 03e5631..a05b0a5 100644 --- a/Library/Common/Architecture/AsyncAwaiter.cs +++ b/Library/Common/Architecture/AsyncAwaiter.cs @@ -2,7 +2,7 @@ { /// /// 继承这个类可以获得异步等待的功能 - /// 参考实现 + /// 参考实现 /// public abstract class AsyncAwaiter { diff --git a/Library/Common/Network/SocketObject.cs b/Library/Common/Network/SocketObject.cs index 26fe9f8..8251740 100644 --- a/Library/Common/Network/SocketObject.cs +++ b/Library/Common/Network/SocketObject.cs @@ -12,15 +12,10 @@ namespace Milimoe.FunGame.Core.Library.Common.Network public object[] Parameters { get; } = Array.Empty(); public int Length => Parameters.Length; - /// - /// 从参数列表中获取指定索引的参数的Json字符串 - /// -- 此索引器仅返回Json字符串,对象类型请使用反序列化方法GetParam() -- - /// -- 当然也可以自己反序列化 -- - /// -- 基本类型可能有效,但仍建议使用反序列化方法 -- - /// - /// 索引 - /// - /// 索引超过数组上限 + // 从参数列表中获取指定索引的参数的Json字符串 + // -- 此索引器仅返回Json字符串,对象类型请使用反序列化方法GetParam() -- + // -- 当然也可以自己反序列化 -- + // -- 基本类型可能有效,但仍建议使用反序列化方法 -- public object? this[int index] { get diff --git a/Library/Constant/ConstantSet.cs b/Library/Constant/ConstantSet.cs index 29939d3..e404d3d 100644 --- a/Library/Constant/ConstantSet.cs +++ b/Library/Constant/ConstantSet.cs @@ -228,7 +228,7 @@ namespace Milimoe.FunGame.Core.Library.Constant /// /// 获取字符串对应的枚举 /// - /// + /// /// public static RoomType GetRoomType(string typestring) { diff --git a/Service/AddonManager.cs b/Service/AddonManager.cs index 1a54441..20b47ec 100644 --- a/Service/AddonManager.cs +++ b/Service/AddonManager.cs @@ -9,6 +9,7 @@ namespace Milimoe.FunGame.Core.Service /// 从plugins目录加载所有插件 /// /// + /// /// internal static Dictionary LoadPlugins(Dictionary plugins, params object[] objs) { diff --git a/Service/JsonManager.cs b/Service/JsonManager.cs index b581afc..0f499fa 100644 --- a/Service/JsonManager.cs +++ b/Service/JsonManager.cs @@ -78,7 +78,6 @@ namespace Milimoe.FunGame.Core.Service /// 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别 /// /// - /// /// /// internal static object? GetObject(string json, JsonSerializerOptions options) diff --git a/docs/api.xml b/docs/api.xml new file mode 100644 index 0000000..c9df2b3 --- /dev/null +++ b/docs/api.xml @@ -0,0 +1,1931 @@ + + + + FunGame.Core + + + + + 需要配合Milimoe.FunGame.Core.Library.Constant.DataRequestType使用 + 确保已添加对应的枚举 + + + + + 数据请求结果 + + + + + 详细错误信息 + + + + + 私有的实现类 + + + + + 基于本地已连接的Socket创建新的数据请求 + 使用RunTimeModel中的NewDataRequest创建一个新的请求 + + + + + + + + 添加数据 + + + + + + + 长时间运行的数据请求需要在使用完毕后自行关闭 + + + + + 向服务器发送数据请求 + + + + + + 异步向服务器发送数据请求 + + + + + + 获取指定key对应的反序列化对象 + + + + + + + + 反序列化Hashtable中的Json对象 + + + + + + + + + 邮件服务内部ID + + + + + Smtp客户端信息 + + + + + 上一个邮件发送的结果 + + + + + 上一个邮件的发送错误信息(如果发送失败) + + + + 内部变量 + + + + 创建邮件服务 + + + + + + + + + + + 创建完整邮件对象 + + + + + + + + + + + + + 发送邮件 + + + + + + + 关闭邮件服务 + + + + + 关闭邮件服务 + + + + + + 需要在Server中继承此类实现 + + + + + 执行一个命令 + + 影响的行数 + + + + 执行一个指定的命令 + + 命令 + 影响的行数 + + + + 查询DataSet + + 结果集 + + + + 执行指定的命令查询DataSet + + 命令 + 结果集 + + + + 执行指定的命令查询DataRow(可选实现) + + 结果行 + + + + 执行指定的命令查询DataRow(可选实现) + + 命令 + 结果行 + + + + 关闭连接 + + + + + 创建一个SQL事务 + + + + + 提交事务 + + + + + 回滚事务 + + + + + 获取角色实例 + + + + + + 获取库存实例 + + + + + + 获取物品实例,默认返回Passiveitem 被动物品 需要强制转换 + + Item类型 主动 或 被动 + + + + + 获取主动物品实例 + + + + + + 获取被动物品实例 + + + + + + 获取房间实例 + + 房间内部序列号 + 房间号 + 创建时间 + 房主 + 房间类型 + 房间状态 + 房间密码 + + + + + 通过DataSet获取房间实例 + + + + + + + + 通过DataSet获取房间列表 + + + + + + + + 获取大厅(-1号房) + + + + + + 获取技能实例,默认返回PassiveSkill 被动技能 需要强制转换 + + Skill类型 主动 或 被动 + + + + + 获取主动技能实例 + + + + + + 获取被动技能实例 + + + + + + 获取用户实例 + + + + + + 获取用户实例 + + + + + + + + + + + + + + + + + + + 获取用户实例 + + + + + + + 获取用户实例 + + + + + + + 网络服务工具箱 + + + + + 判断字符串是否是IP地址 + + + + + + + 判断字符串是否为邮箱地址 + + + + + + + 判断字符串是否是正常的用户名(只有中英文和数字) + + + + + + + 获取用户名长度 + + + + + + + 判断字符串是否是一个FunGame可接受的服务器地址 + + + + + + + 判断参数是否是一个FunGame可接受的服务器地址 + + + + + + + + 获取服务器的延迟 + + 服务器IP地址 + + + + + 返回目标对象的Json字符串 + + + + + + + + 返回目标对象的Json字符串 可指定反序列化选项 + + + + + + + + + 反序列化Json对象 + + + + + + + + 反序列化Json对象 可指定反序列化选项 + + + + + + + + + 反序列化Hashtable中的Json对象 + + + + + + + + + 反序列化Hashtable中的Json对象 可指定反序列化选项 + + + + + + + + + + 时间服务工具箱 + + + + + 获取系统时间 + + 格式化类型 + + + + + 通过字符串转换为DateTime对象 + + 时间字符串 + 转换失败返回当前时间 + + + + 获取系统时间并转为字符串 + + 格式化类型 + + + + + 获取系统短日期 + + + + + + 获取系统日期 + + + + + + 使用HMACSHA512算法加密 + + + + + 使用HMACSHA512算法加密 + + 需要加密的值 + 秘钥 + + + + + 使用RSA算法加密 + + 明文 + 公钥 + + + + + 使用RSA算法解密 + + 密文 + 私钥 + + + + + 使用HMACSHA512算法加密 + + 需要加密的值 + 秘钥 + + + + + 生成验证码 + + 类型 + 长度 + + + + + 数字验证码 + + + + + + + 字母验证码 + + + + + + + 混合验证码 + + + + + + + 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 + + + + + + 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 + + + + + + 开启一个计时器任务 + + + + + + + See: , , + + + + + 获取FunGame.Implement.dll中接口的实现方法 + + 程序集 + 接口代号 + + + + + 获取接口实现类类名 + + 接口类型 + + + + + 获取接口方法名 + + 方法 + + + + + 公开方法:获取FunGame.Implement.DLL中指定方法的返回值 + + 接口代号 + 方法代号 + + + + + 创建一个Json工具类 + 此工具类拥有单独的序列化选项,支持添加自定义转换器 + 继承自 + + + + + 序列化选项 + 已经默认添加了下列转换器: + , , + + + + + 注册一个自定义转换器,支持 + + + + + + 注册多个自定义转换器,支持 + + + + + + 获取Json字符串 + + + + + + + + 反序列化Json对象 + + + + + + + + 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别 + + + + + + + 反序列化Hashtable中Key对应的Json对象 + + + + + + + + + 反序列化多个Json对象 + 注意必须是相同的Json对象才可以使用此方法解析 + + + + + + + + Private JsonSerializerOptions + + + + + 单例表:表中的对象以类名作为Key保存,并以Key获取该对象,Key具有唯一约束 + 用于储存单例对象使用 + + + + + 查询目标的类是否已经有实例 + + 单例对象 + + + + + 将目标和目标的类添加至单例表 + + 单例对象 + + 添加单例到单例表时遇到错误 + + + + 将目标和目标的类从单例表中移除 + + 单例对象 + + + + + 获取单例对象 + + 目标类 + + 不能从单例表中获取到指定的单例 + + + + 获取单例对象 + + 目标类 + + 不能从单例表中获取到指定的单例 + + + + 默认的配置文件名称 + + + + + 写入ini文件 + + Section + 键 + 值 + 文件名,缺省为FunGame.ini + + + + 读取ini文件 + + Section + 键 + 文件名,缺省为FunGame.ini + 读取到的值 + + + + 查询ini文件是否存在 + + 文件名,缺省为FunGame.ini + 是否存在 + + + + 初始化ini模板文件 + + + + + 读取TXT文件内容 + + 文件名 + 相对路径 + 内容 + + + + Aka. 2FA 双重认证 双因素身份验证 + + + + + SQLHelper 允许为空 + + + + + 不使用SQL模式 + + + + + 使用SQL模式 记录对应账号的密文到数据库中 + + + + + + 检查账号是否需要2FA + + + + + + + 2FA验证 + + + + + + + + 每30秒刷新 + + + + + 6位数字2FA验证码 + + + + + ----- PUBLIC KEY ----- + + + + + ----- SECRET SIGN ----- + + + + + 创键私钥,用于绑定账号,并生成两个文件,需要用户保存 + + + + + 生成随机秘钥字符串 + + + + + + + 生成基于当前时间戳的6位数字2FA验证码 + + + + + + + 获取当前时间节点 + + + + + + 生成验证码 + + + + + + + + 拆分字符串中的密文和私钥 + + + + + + + + 此类实现服务器连接、断开连接、心跳检测、创建数据请求等功能 + -- 需要继承并实现部分方法 -- + + + + + 与服务器的连接套接字实例 + + + + + 套接字是否已经连接 + + + + + 接收服务器信息的线程 + + + + + 用于类内赋值 + + + + + 是否正在接收服务器信息 + + + + + 断开服务器连接 + + + + + + 连接服务器 + + + + + + + + 获取服务器地址 + + string:IP地址;int:端口号 + + + + + 此方法将在连接服务器前触发 + 客户端可以重写此方法 + + + + false:中止连接 + + + + 此方法将在连接服务器后触发(Connect结果返回前) + 客户端可以重写此方法 + + 连接服务器后返回的一些数据,可以使用也可以修改它们 + + + + + 客户端需要自行实现自动登录的事务 + + + + + 关闭所有连接 + + + + + + 输出消息 + + + + + + 自定处理异常的方法 + -- 一般放在catch中 -- + + + + + + 基于本地已连接的Socket创建新的数据请求 + + + + + + + + 基于本地已连接的Socket创建长时间运行的数据请求 + + + + + + + + 开始接收服务器信息 + + + + + 获取服务器已发送的信息为SocketObject数组 + + + + + + 具体接收服务器信息以及处理信息的方法 + + + + + + 客户端接收到服务器断开连接的通知后的处理方法 + + + + + + 客户端接收到服务器系统消息后的处理方法 + + + + + + 客户端接收到服务器心跳后的处理方法 + + + + + + 客户端接收到强制退出登录的通知后的处理方法 + + + + + + 客户端接收到聊天信息后的处理方法 + + + + + + 客户端接收到更换房主后的处理方法 + + + + + + 客户端接收到匹配房间成功后的处理方法 + + + + + + 客户端接收到开始游戏信息后的处理方法 + + + + + + 客户端接收到游戏结束信息后的处理方法 + + + + + + 客户端接收到局内消息后的处理方法 + + + + + + 继承 AsyncAwaiter 用法: + 1、调用Socket.Send()前,请设置为等待状态:SetWorking(); + 2、调用Socket.Send() == Success后,请等待任务完成:WaitForWorkDone(); + 3、在其他任何地方修改Working状态,均会使任务终止。 + + + + + 接收到的SocketObject实例 + + + + + Socket + + + + + 继承请调用base构造 + + Socket + + + + 继承请重写此方法 + + SocketObject + + + + 判断是否已经Disposed + + + + + 公开的Dispose方法 + + + + + 关闭时 + + + + + + 关闭事件 + + + + + Controller关闭时事件 + 不建议new Dispose()方法,建议使用事件 + 事件会在base.Dispose()执行前触发 + + + + + 触发关闭事件 + + + + + 记录 的生涯、赛季统计数据 + Key为赛季(long),每个key代表第key赛季,key = 0时为生涯数据。 + + + + + 窗体继承这些接口便能实现事件,或为插件预留。 + + + + + 插件需要实现什么事件就继承什么接口 + + + + + 继承这个类可以获得异步等待的功能 + 参考实现 + + + + + 接收到的实例 + + + + + 是否处于等待的状态 + + + + + 异步操作前,请设置为等待状态 + + + + + 等待任务完成(需要自己异步) + + + + + 异步等待任务完成 + + + + + 任务的等待器,可以设置在任务完成后需要的操作 + + + + + 任务是否完成 + + + + + 捕获到的异常 + + + + + 内部实现类 + 实现参见 + + + + + 构造一个等待器 + + + + + + 返回TaskAwaiter可以连续的调用方法 + 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 + 可以理解为并行广播 + + + + + + + 在捕获到异常时,将触发Error事件 + + + + + + + 发件人邮箱 + + + + + 发件人名称 + + + + + 邮件主题 + + + + + 邮件内容 + + + + + 邮件优先级 + + + + + 内容是否支持HTML + + + + + 收件人列表 + + + + + 抄送列表 + + + + + 密送列表 + + + + + 使用MailSender工具类创建邮件对象 + + + + + + 使用地址和名称创建邮件对象 + + + + + + + 使用地址和名称创建邮件对象,同时写主题、内容、单个收件人 + + + + + + + + + 使用地址和名称创建邮件对象,同时写主题、内容、单个收件人、单个抄送 + + + + + + + + + + 完整的创建邮件对象 + + + + + + + + + + + + + 发送邮件 + -- 适合创建一次性邮件并发送 -- + + + + + + + 添加收件人 + + + + + + 添加多个收件人 + + + + + + 添加抄送 + + + + + + 添加多个抄送 + + + + + + 添加密送 + + + + + + 添加多个密送 + + + + + + 从参数列表中获取指定类型和索引的参数 + + 类型 + 索引 + 类型的参数 + 索引超过数组上限 + + + + 插件名称 + + + + + 插件描述 + + + + + 插件版本 + + + + + 插件作者 + + + + + 加载标记 + + + + + 加载插件 + + + + + 插件加载后需要做的事 + + + + + 允许返回false来阻止加载此插件 + + + + + + 传递委托以便让插件调用 + + + + + 输出系统消息 + + + + + 基于本地已连接的Socket创建新的数据请求 + + + + + 基于本地已连接的Socket创建长时间运行的数据请求 + + + + + Session对象 + + + + + Config对象 + + + + + 绑定事件。在后触发 + + + + + 必须继承基类: + 继承事件接口并实现其方法来使插件生效。例如继承: + + + + + 需要同步更新 + + + + + 将通信类型的枚举转换为字符串 + + 通信类型 + 等效字符串 + + + + 需要同步更新 + + + + RunTime + + + Main + + + Register + + + Login + + + Room + + + Gaming + + + + 获取Type的等效字符串 + + + + + + + 获取Type的等效字符串 + + + + + + + 获取字符串对应的枚举 + + + + + + + 添加-debug启动项将开启DebugMode(仅适用于Desktop或Console) + 目前支持禁用心跳检测功能 + + + + + 需要同步更新 + + + + + 需要同步更新 + + + + Commands + + + + 是否自动连接服务器 + + + + + 是否自动登录 + + + + + 是否在匹配中 + + + + + 是否连接上服务器 + + + + + 是否正在重连 + + + + + 是否自动重连 + + + + + 是否在房间中 + + + + + 当前游戏模式 + + + + + 服务器名称 + + + + + 公告 + + + + + 自动登录的账号 + + + + + 自动登录的密码 + + + + + 自动登录的秘钥 + + + + + 服务器IP地址 + + + + + 服务器端口号 + + + + + SocketToken + + + + + LoginKey + + + + + 已登录的用户 + + + + + 已登录用户名 + + + + + 所处的房间 + + + + + 从plugins目录加载所有插件 + + + + + + + + 默认的序列化选项 + + + + + 获取Json字符串 + + + + + + + + 获取Json字符串 + + + + + + + + + 反序列化Json对象 + + + + + + + + 反序列化Json对象 + + + + + + + + + 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别 + + + + + + + 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别 + + + + + + + + 反序列化SocketObject中索引为index的Json对象 + + + + + + + + + + 反序列化Hashtable中Key对应的Json对象 + + + + + + + + + 反序列化Hashtable中Key对应的Json对象 + + + + + + + + + + 反序列化多个Json对象 + 注意必须是相同的Json对象才可以使用此方法解析 + + + + + + + + 反序列化多个Json对象 + 注意必须是相同的Json对象才可以使用此方法解析 + + + + + + + + + 用于保存Smtp客户端 + 一个邮件服务对应一个Smtp客户端 + + + + + 用于保存邮件服务 + 允许服务器同时存在多个服务 + + + + + 获取某个已经保存过的邮件服务 + + + + + + + 统一调用此方法发送邮件 + + + + + + + + + 关闭邮件服务 + + + + + + + 目前的Model数量 + + + + + 最大接受的Model数量 + + + + + 可参与高并发的字典,但添加效率较低 + + + + + Init ModelManager + + MaxModel + + + + 获取Model对象 + + Model的Key + Model对象 + + + + 向Model管理器中添加Model + + Model的Key + Model对象 + True:操作成功 + + + + 从Model管理器中移除Model + + Model的Key + True:操作成功 + + + + 将Model移除,并取得这个Model + + Model的Key + Model对象 + 被移除的Model + + + + 将Model移除,并取得这个Model + + Model的Key + 被移除的Model + + + + 清空Model管理器 + + + + + 获取Model对象的列表 + + + + + 客户端专用Socket + + + + + 服务器端专用Socket + + + + + 创建服务器监听Socket + + 监听端口号 + 最大连接数量 + 服务器端专用Socket + + + + 创建一个监听到客户端Socket + + 客户端IP地址[0]和客户端Socket[1] + + + + 创建客户端Socket + + 服务器IP地址 + 服务器监听端口 + 客户端专用Socket + + + + 用于服务器端向客户端Socket发送信息 + + 客户端Socket + Socket信息容器 + 通信结果 + + + + 用于客户端向服务器Socket发送信息 + + Socket信息容器 + 通信结果 + + + + 用于客户端接收服务器信息 + + SocketObject + + + + 用于服务器接收客户端信息 + + 客户端Socket + SocketObject + + + + 用于客户端接收服务器信息(数组版) + + SocketObjects + + + + 用于服务器接收客户端信息(数组版) + + 客户端Socket + SocketObjects + + + + 监听事件的委托 + + SocketObject + + + + 监听事件 + + + + + 触发异步监听事件 + + SocketObject + + + + 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 + + + + + + + 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 + + + + + + + 内部实现类 + + + + + 返回ITaskAwaiter可以进一步调用方法 + 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 + 可以理解为并行广播 + + + + + + + 在捕获到异常时,将触发Error事件 + + + + + +