using Cysharp.Threading.Tasks; using System; using UnityEngine; /// /// ClientSocket 适配器 - 将 ClientSocket 适配为 INetworkService 接口 /// (不修改已验证的 ClientSocket 代码) /// public class ClientSocketAdapter : INetworkService { private ClientSocket clientSocket; private NetworkState _state = NetworkState.Disconnected; public NetworkState State { get => _state; private set { if (_state != value) { _state = value; OnStateChanged?.Invoke(value); } } } /// /// 是否已连接(适配 ClientSocket.connected) /// public bool IsConnected => clientSocket != null && clientSocket.connected; /// /// 最后收包时间(适配 ClientSocket.lastPackageTime) /// public DateTime LastPackageTime => clientSocket?.lastPackageTime ?? DateTime.MinValue; public event Action OnStateChanged; /// /// 构造函数 /// public ClientSocketAdapter(ServerType type) { clientSocket = new ClientSocket(type); Debug.Log($"[ClientSocketAdapter] 初始化 TCP Socket({type})"); } /// /// 连接到 TCP 服务器(适配 ClientSocket.Connect) /// public async UniTask ConnectAsync(string url) { try { State = NetworkState.Connecting; // 解析 URL(支持 "ip:port" 或 "tcp://ip:port") string ip; int port; ParseUrl(url, out ip, out port); Debug.Log($"[ClientSocketAdapter] 连接 {ip}:{port}"); // 使用 UniTask 包装回调 var tcs = new UniTaskCompletionSource(); clientSocket.Connect(ip, port, (success) => { if (success) { State = NetworkState.Connected; Debug.Log("[ClientSocketAdapter] 连接成功"); } else { State = NetworkState.Disconnected; Debug.LogError("[ClientSocketAdapter] 连接失败"); } tcs.TrySetResult(success); }); return await tcs.Task; } catch (Exception ex) { Debug.LogError($"[ClientSocketAdapter] 连接异常: {ex.Message}"); State = NetworkState.Disconnected; return false; } } /// /// 断开连接(异步) /// public async UniTask DisconnectAsync() { if (clientSocket != null) { clientSocket.CloseConnect(); State = NetworkState.Disconnected; } await UniTask.CompletedTask; } /// /// 断开连接(同步,适配 ClientSocket.CloseConnect) /// public void Disconnect() { if (clientSocket != null) { clientSocket.CloseConnect(); State = NetworkState.Disconnected; } } /// /// 发送协议包(适配 ClientSocket.SendInfo) /// public void SendInfo(GameNetPackBasic protocol) { if (!IsConnected) { Debug.LogError("[ClientSocketAdapter] 未连接,无法发送协议包"); return; } clientSocket.SendInfo(protocol); } /// /// 发送二进制数据(适配 ClientSocket.SendInfo) /// public void SendInfo(byte[] data) { if (!IsConnected) { Debug.LogError("[ClientSocketAdapter] 未连接,无法发送数据"); return; } clientSocket.SendInfo(data); } /// /// 发送二进制数据(异步) /// public async UniTask SendAsync(byte[] data) { SendInfo(data); await UniTask.CompletedTask; } /// /// 获取内部的 ClientSocket(兼容性访问) /// public ClientSocket GetClientSocket() { return clientSocket; } /// /// 解析 URL /// private void ParseUrl(string url, out string ip, out int port) { // 默认端口 port = 8080; // 移除协议前缀 if (url.StartsWith("tcp://")) { url = url.Substring(6); } // 分割 IP 和端口 var parts = url.Split(':'); ip = parts[0]; if (parts.Length > 1 && int.TryParse(parts[1], out int parsedPort)) { port = parsedPort; } } }