using System;
using System.Collections.Concurrent;
using System.ComponentModel;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using TeamAAS.Communication.Attributes;
using TeamAAS.Communication.Base;
using TeamAAS.Communication.Interfaces;
using TeamAAS.Communication.Enums;
namespace TeamAAS.Communication.Devices
{
///
/// TCP 客户端(主动连接外部设备),纯透传。
///
[Communication("TCP 客户端", "基础通讯", "TCP 主动连接,纯透传")]
public class TcpClientCommunication : BindableCommunicationBase
{
[JsonIgnore]
private TcpClient _tcpClient;
[JsonIgnore]
private NetworkStream _stream;
private readonly ConcurrentQueue _received = new ConcurrentQueue();
[JsonIgnore]
private readonly StringBuilder _receiveBuffer = new StringBuilder();
[JsonIgnore]
private System.Threading.Timer _reconnectTimer;
[JsonIgnore]
private volatile bool _hasConnectedOnce;
[JsonIgnore]
private volatile bool _manualDisconnect;
[JsonIgnore]
private volatile bool _isReconnecting;
private string _ipAddress = "127.0.0.1";
[Category("I.客户端配置"), DisplayName("1.对端 IP 地址"), Description("对端 IP 地址")]
public string IpAddress
{
get { return _ipAddress; }
set { if (SetProperty(ref _ipAddress, value)) Notify(nameof(EndpointUrl)); }
}
private int _port = 5000;
[Category("I.客户端配置"), DisplayName("2.对端端口"), Description("对端端口")]
public int Port
{
get { return _port; }
set { if (SetProperty(ref _port, value)) Notify(nameof(EndpointUrl)); }
}
private Terminator _terminator = Terminator.None;
[Category("III.数据格式"), DisplayName("结束符"), Description("发送时自动附加、接收时自动去除的结束符")]
public Terminator Terminator
{
get { return _terminator; }
set { SetProperty(ref _terminator, value); }
}
private DataEncoding _dataEncoding = DataEncoding.Default;
[Category("III.数据格式"), DisplayName("编码格式"), Description("收发数据的编码格式")]
public DataEncoding DataEncoding
{
get { return _dataEncoding; }
set { SetProperty(ref _dataEncoding, value); }
}
[Browsable(false)]
public override string EndpointUrl
{
get { return $"tcp://{IpAddress}:{Port}"; }
set
{
if (!string.IsNullOrWhiteSpace(value) && value.StartsWith("tcp://"))
{
var uri = new Uri(value);
IpAddress = uri.Host;
Port = uri.Port;
}
}
}
[JsonIgnore, Browsable(false)]
public override bool IsConnected => (_tcpClient != null && _tcpClient.Connected);
public override event Action