using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace LB_VisionProcesses.Communicators.TCom { public class TCPClient : BaseCommunicator { private TcpClient _tcpClient = new TcpClient(); private NetworkStream _networkStream; private StreamReader _reader; private StreamWriter _writer; public TCPClient(string name = "TCP客户端") { CommunicatorConnections.Add("地址", "127.0.0.1"); CommunicatorConnections.Add("端口", "1111"); CommunicatorBrand = CommunicatorBrand.TCPClient; CommunicatorName = name; } public override bool Connect() { try { Disconnect(); int PORT = 0; if (!int.TryParse(this.CommunicatorConnections["端口"].ToString(), out PORT)) { Msg = string.Format("端口未设置"); return false; } if (!CommunicatorConnections.Contains("地址")) { Msg = string.Format("地址未设置"); return false; } string IP = CommunicatorConnections["地址"].ToString(); _tcpClient.Connect(IPAddress.Parse(IP), PORT); _networkStream = _tcpClient.GetStream(); _reader = new StreamReader(_networkStream, Encoding.UTF8); //_writer = new StreamWriter(_networkStream, Encoding.UTF8) { AutoFlush = true }; _writer = new StreamWriter(_networkStream, Encoding.UTF8) { AutoFlush = true }; bConnected = true; bHeart = true; // 启动心跳线程 heartbeatThread = new Thread(SendHeartbeat); heartbeatThread.IsBackground = true; heartbeatThread.Start(); // 启动接收线程 Task.Run(HandleServerComm); return true; } catch (Exception ex) { Msg = $"失败,服务器未启动: {ex.Message}"; return false; } } public override bool Disconnect() { try { bConnected = false; if (_tcpClient.Connected) { _reader.Close(); _writer.Close(); _networkStream.Close(); _tcpClient.Close(); } _tcpClient = new TcpClient(); return true; } catch { bConnected = false; return true; } } private async Task HandleServerComm() { while (bConnected) { try { await Task.Delay(25); // 等待 25ms 后再尝试检查数据 byte[] buffer = new byte[1024]; int bytesRead = _networkStream.Read(buffer, 0, buffer.Length); if (bytesRead > 0) { string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); if (message != null) { strReceiveMsg = message; try { TriggerRunMessageReceived?.Invoke(CommunicatorName, strReceiveMsg); // 触发运行事件 } catch { } try { MessageReceived?.Invoke(strReceiveMsg); // 触发回调 } catch { } } } } catch (Exception ex) { bHeart = false; Debug.WriteLine($"接收消息时发生错误: {ex.Message}"); } } } // 发送消息到服务器 public override bool SendMessage(string message) { if (!bConnected) { Msg = "尚未连接到服务器"; return false; } try { //空消息不发送 if (string.IsNullOrEmpty(message) || message.Trim() == "") return true; _writer.Write(message); //_writer.Flush(); // 强制将缓冲区中的数据写入网络流 return true; } catch (Exception ex) { bHeart = false; Msg = $"发送消息时发生错误: {ex.Message}"; return false; } } } }