阅读量:0
在C#中实现Socket的断线重连,可以通过封装一个自定义的Socket类,该类包含重连逻辑和异常处理。以下是一个简单的示例:
using System; using System.Net; using System.Net.Sockets; using System.Threading; public class ReconnectingSocket { private Socket _socket; private EndPoint _remoteEndPoint; private int _reconnectInterval; // 重连间隔(毫秒) private bool _isConnected; private readonly object _lock = new object(); public ReconnectingSocket(EndPoint remoteEndPoint, int reconnectInterval = 5000) { _remoteEndPoint = remoteEndPoint; _reconnectInterval = reconnectInterval; } public void Connect() { lock (_lock) { if (_isConnected) return; _socket = new Socket(_remoteEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); while (!_isConnected) { try { _socket.Connect(_remoteEndPoint); _isConnected = true; } catch (Exception ex) { Console.WriteLine($"连接失败: {ex.Message}"); Thread.Sleep(_reconnectInterval); } } } } public void Disconnect() { lock (_lock) { if (!_isConnected) return; _socket.Shutdown(SocketShutdown.Both); _socket.Close(); _isConnected = false; } } public void Send(byte[] data) { if (!_isConnected) throw new InvalidOperationException("套接字未连接"); try { _socket.Send(data); } catch (Exception ex) { Console.WriteLine($"发送数据失败: {ex.Message}"); _isConnected = false; Connect(); } } public byte[] Receive(int bufferSize) { if (!_isConnected) throw new InvalidOperationException("套接字未连接"); byte[] buffer = new byte[bufferSize]; try { int receivedBytes = _socket.Receive(buffer); if (receivedBytes > 0) { byte[] data = new byte[receivedBytes]; Array.Copy(buffer, 0, data, 0, receivedBytes); return data; } } catch (Exception ex) { Console.WriteLine($"接收数据失败: {ex.Message}"); _isConnected = false; Connect(); } return null; } }
使用示例:
class Program { static void Main(string[] args) { IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); int port = 8080; IPEndPoint remoteEndPoint = new IPEndPoint(ipAddress, port); ReconnectingSocket socket = new ReconnectingSocket(remoteEndPoint); socket.Connect(); // 发送和接收数据... socket.Disconnect(); } }
这个示例中的ReconnectingSocket
类封装了一个标准的Socket对象,并在发送和接收数据时添加了重连逻辑。当连接断开时,它会尝试每隔指定的时间间隔(默认为5秒)重新连接。你可以根据需要调整重连间隔和其他参数。