/*
伪代码计划(详细步骤):
1. 在文件顶部添加多行注释,说明将要执行的注释生成工作(用于审阅)。
2. 为公共类 `TcpProtocol` 添加 XML 文档注释,描述其用途与行为。
3. 为构造函数添加注释,说明参数含义及默认值。
4. 为每个公共属性(如 `IsConnected`,`_waitClient`,`Terminator`,`Encoding`)添加 XML 注释,说明返回值或作用,指明线程/连接相关注意事项(只读/可写)。
5. 为事件(`ConnectionChanged`、`DataReceived`、`DataSent`)添加注释,说明何时触发、参数含义。
6. 为每个公共方法添加 XML 注释:
- `ConnectAsync`: 说明尝试连接的行为、返回值及异常处理,标注使用的配置项(结束符处理)。
- `DisconnectAsync`: 说明断开连接的行为及事件触发。
- `SendAndReceiveAsync(byte[], int)`: 说明发送/接收的流程、超时含义及可能抛出的异常。
- `SendAsync(byte[])`, `Send(byte[])`, `Send(string)`, `SendAsync(string)`: 说明发送方法区别与同步/异步注意事项。
- 同步版本的 `SendAndReceive` 方法说明阻塞行为与异常。
- `Dispose`: 说明释放资源。
7. 保持现有实现不变,仅插入文档注释与必要的内部注释,以便于 IntelliSense 与维护。
8. 确保注释为中文,简洁明了,符合 .NET XML 注释惯例,并且不修改代码逻辑或签名。
注:所有注释均以 XML 文档注释形式写入,便于 Visual Studio 的 IntelliSense 展示。
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web.UI.WebControls.WebParts;
using TeamAAS_VP.Enums;
using TeamAAS_VP.Models.Robot;
using TouchSocket.Core;
using TouchSocket.Sockets;
namespace TeamAAS_VP.Core.Lights
{
///
/// 基于 TouchSocket 的 TCP 通信协议实现。
/// 提供同步/异步的发送/接收方法,并在连接状态、发送/接收数据时触发事件。
/// 注意:此类不保证线程安全,调用方应在多线程场景做并发控制。
///
public class TcpProtocol : ICommunicationProtocol
{
///
/// 目标主机地址(仅构造时设置)。
///
private readonly string _host;
///
/// 目标端口(仅构造时设置)。
///
private readonly int _port;
///
/// TouchSocket 的 TCP 客户端实例。
///
private TcpClient _client;
///
/// 获取当前连接状态。若未初始化客户端或客户端不在线,则返回 false。
///
public bool IsConnected => _client?.Online == true;
///
/// 等待客户端,用于发送后等待返回(SendThenReturn)的操作。
/// 注意:该字段在连接成功后由 ConnectAsync 初始化。
///
public IWaitingClient _waitClient { get; private set; }
///
/// 数据包结束符配置,决定接收时的数据分包行为(None/CR/LF/CRLF)。
///
public Terminator Terminator { get; set; } = Terminator.None;
///
/// 数据编码,默认使用 ASCII。
/// 在发送/接收时用于将字符串与字节数组互相转换。
///
public Encoding Encoding { get; set; } = Encoding.ASCII;
///
/// 当连接状态发生变化时触发。参数:sender、是否已连接(true=已连接)。
///
public event Action