public class TCPClient
{
#region 屬性
/// <summary>
/// 服務端IP
/// </summary>
public string ServerIp;
/// <summary>
/// 服務端監聽埠
/// </summary>
public int ServerPort;
/// <summary>
/// TcpClient客戶端
/// </summary>
public TcpClient Tcpclient = null;
/// <summary>
/// Tcp客戶端連接執行緒
/// </summary>
public Thread Tcpthread= null;
/// <summary>
/// 是否啟動Tcp連接執行緒
/// </summary>
public bool IsStartTcpthreading = false;
/// <summary>
/// 連接是否關閉(用來斷開重連)
/// </summary>
public bool Isclosed= false;
/// <summary>
/// 設定斷開重連時間間隔單位(毫秒)(默認3000毫秒)
/// </summary>
public int ReConnectionTime = 3000;
/// <summary>
/// 接收Socket資料包 快取字串
/// </summary>
public string Receivestr;
/// <summary>
/// 重連次數
/// </summary>
public int ReConectedCount = 0;
#endregion
#region 建構式
/// <summary>
/// 初始化TCPClient類
/// </summary>
/// <param name="ip">服務端IP</param>
/// <param name="port">監聽埠</param>
public TCPClient(string ip, string port)
{
ServerIp = ip;
ServerPort = int.Parse(port);
}
#endregion
#region 方法
/// <summary>
/// 啟動連接Socket服務器
/// </summary>
public void StartConnection()
{
try
{
CreateTcpClient();
}
catch (Exception ex)
{
//DelegateHelper.TcpClientErrorMsg("錯誤資訊:" + ex.Message);
}
}
/// <summary>
/// 創建執行緒連接
/// </summary>
private void CreateTcpClient()
{
if (Isclosed)
return;
Isclosed = true;
Tcpthread = new Thread(StartTcpThread);
IsStartTcpthreading = true;
Tcpthread.Start();
}
/// <summary>
/// 執行緒接收Socket上傳的資料
/// </summary>
private void StartTcpThread()
{
byte[] receivebyte = new byte[1024];
int bytelen;
try
{
while (IsStartTcpthreading)
#region
{
// Thread.Sleep(50);
if (!Tcpclient.Connected)
{
Tcpclient = new TcpClient();
try
{
if (ReConectedCount != 0)
{
//回傳狀態資訊
//DelegateHelper.TcpClientStateInfo(string.Format("正在第{0}次重新連接服務器... ...", ReConectedCount), EnumClass.SocketState.Reconnection);
}
else
{
//SocketStateInfo
//DelegateHelper.TcpClientStateInfo("正在連接服務器... ...", EnumClass.SocketState.Connecting);
}
Tcpclient.Connect(IPAddress.Parse(ServerIp), ServerPort);
//DelegateHelper.TcpClientStateInfo("已連接服務器",EnumClass.SocketState.Connected);
//Tcpclient.Client.Send(Encoding.Default.GetBytes("login"));
}
catch
{
//連接失敗
ReConectedCount++;
Isclosed = false;
IsStartTcpthreading = false;
Thread.Sleep(ReConnectionTime);
continue;
}
}
bytelen = Tcpclient.Client.Receive(receivebyte);
// 連接斷開
if (bytelen == 0)
{
//回傳狀態資訊
//DelegateHelper.TcpClientStateInfo("與服務器斷開連接... ...",EnumClass.SocketState.Disconnect);
// 例外退出、強制重新連接
Isclosed = false;
ReConectedCount = 1;
IsStartTcpthreading = false;
continue;
}
Receivestr = ASCIIEncoding.Default.GetString(receivebyte, 0, bytelen);
if (Receivestr.Trim() != "")
{
//接收資料
//DelegateHelper.TcpClientReceive(Receivestr);
}
}
#endregion
//此時執行緒將結束,人為結束,自動判斷是否重連
Thread.Sleep(ReConnectionTime);
CreateTcpClient();
}
catch (Exception ex)
{
//CreateTcpClient();
//回傳錯誤資訊
//DelegateHelper.TcpClientErrorMsg("錯誤資訊:" + ex.Message);
}
}
/// <summary>
/// 斷開連接
/// </summary>
public void StopConnection()
{
IsStartTcpthreading = false;
Isclosed = false;
Tcpclient.Close();
Tcpthread.Interrupt();
Tcpthread.Abort();
//DelegateHelper.TcpClientStateInfo("斷開連接",EnumClass.SocketState.Disconnect);
}
/// <summary>
/// 發送Socket訊息
/// </summary>
/// <param name="cmdstr"></param>
public void SendCommand(string cmdstr)
{
try
{
byte[] _out = Encoding.Default.GetBytes(cmdstr);
Tcpclient.Client.Send(_out);
}
catch (Exception ex)
{
//回傳錯誤資訊
//DelegateHelper.TcpClientErrorMsg(ex.Message);
}
}
#endregion
}
#region IPlugin介面實作方法
TCPClient _tcpClient;
/// <summary>
/// 初始化連接
/// </summary>
public void Init(string ip, string port, string servername, string state, string heartbeat)
{
_tcpClient = new TCPClient(ip, port);
_tcpClient.StartConnection();
heartbeatMessage = heartbeat;
HeartStart();
}
#endregion
#region 心跳
string heartbeatMessage = null;
private Thread TcpHeart { get; set; }
/// <summary>
/// 心跳方法
/// </summary>
public void HeartStart()
{
TcpHeart = new Thread(new ThreadStart(RunKeepAliveThread));
TcpHeart.IsBackground = true;
TcpHeart.Start();
}
private void RunKeepAliveThread()
{
while (true)
{
Thread.Sleep(30 * 1000);
//平板切紙機心跳報文
string msg = string.Format($"{heartbeatMessage}\n");
//指令下發
if (_tcpClient != null)
_tcpClient.SendCommand(msg);
}
}
#endregion
uj5u.com熱心網友回復:
代碼有點長,具體是什么場景?多個客戶端是多個exe還是同一個程式里不同的EndPoint?不過TCP是面向連接的協議,TcpClient不能復用。
uj5u.com熱心網友回復:
<SocketClient><DllName name="App.Das.Plugin.Socket.SheetCutter.dll">
<SocketList>
<Ip>127.0.0.1</Ip>
<Port>4001</Port>
<ServerName></ServerName>
<State>1</State>
<HeartBeat>127.0.0.1:4001|4001|4001|4001</HeartBeat>
<ClassName>SheetCutterInterface</ClassName>
</SocketList>
<SocketList>
<Ip>127.0.0.1</Ip>
<Port>4002</Port>
<ServerName></ServerName>
<State>1</State>
<HeartBeat>127.0.0.1:4002|4002|4002|4002</HeartBeat>
<ClassName>SheetCutterInterface</ClassName>
</SocketList>
</DllName>
</SocketClient>
我是想通過讀取XML里的Dll來處理,對于同一型別設備我有20臺都是相同的這一個dll,如果TcpClient不能復用那該怎么弄?
uj5u.com熱心網友回復:
還是沒太明白你的場景。20臺設備和同一臺中心服務器連接?轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/108228.html
標籤:網絡通信
上一篇:一個以太網MAC子層從LLC子層接收到1510個位元組資料。這樣的資料能夠封裝成一個幀嗎?如果不行,必須發送多少個幀?每個幀中的資料有多長?
