在C#中实现TcpClient的自动重连,可以通过封装一个自定义的TcpClient类,该类包含重连逻辑
using System;
using System.Net.Sockets;
using System.Threading;
public class ReconnectingTcpClient
{
private TcpClient _tcpClient;
private string _host;
private int _port;
private int _reconnectInterval; // 重连间隔(毫秒)
private bool _isConnected;
private Thread _reconnectThread;
public ReconnectingTcpClient(string host, int port, int reconnectInterval = 1000)
{
_host = host;
_port = port;
_reconnectInterval = reconnectInterval;
_tcpClient = new TcpClient();
}
public void Connect()
{
_isConnected = true;
_reconnectThread = new Thread(Reconnect);
_reconnectThread.Start();
}
private void Reconnect()
{
while (_isConnected)
{
try
{
if (!_tcpClient.Connected)
{
_tcpClient.Connect(_host, _port);
Console.WriteLine("已连接到服务器");
}
}
catch (Exception ex)
{
Console.WriteLine($"连接失败: {ex.Message}");
Thread.Sleep(_reconnectInterval);
}
}
}
public void Disconnect()
{
_isConnected = false;
_tcpClient.Close();
Console.WriteLine("已断开与服务器的连接");
}
public void Send(byte[] data)
{
if (_tcpClient.Connected)
{
NetworkStream stream = _tcpClient.GetStream();
stream.Write(data, 0, data.Length);
}
}
public byte[] Receive()
{
if (_tcpClient.Connected)
{
NetworkStream stream = _tcpClient.GetStream();
byte[] buffer = new byte[_tcpClient.ReceiveBufferSize];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
byte[] receivedData = new byte[bytesRead];
Array.Copy(buffer, receivedData, bytesRead);
return receivedData;
}
return null;
}
}
使用示例:
class Program
{
static void Main(string[] args)
{
ReconnectingTcpClient client = new ReconnectingTcpClient("127.0.0.1", 8000);
client.Connect();
// 发送和接收数据...
client.Disconnect();
}
}
这个示例中的ReconnectingTcpClient
类包含了自动重连逻辑。当调用Connect()
方法时,会启动一个新线程来处理重连。如果连接丢失,线程会尝试每隔指定的时间间隔(默认为1秒)重新连接。你可以通过修改_reconnectInterval
变量来调整重连间隔。