using System.Diagnostics;
|
using System.Net;
|
using System.Net.Sockets;
|
using System.Text;
|
|
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(byte[] sBytes)
|
{
|
return SendMessage(sBytes.ToString());
|
}
|
|
// 发送消息到服务器
|
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;
|
}
|
}
|
}
|
}
|