c#socket实现tcpClient支持断线重连

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace TcpTools.Utils
{
public class SocketClientHelper
{
private Socket socketClient = null;

private int ReceiveBufferLength = 2048;
private string RemoteIp = "127.0.0.1";
private int RemotePort = 8080;
private int ReadTimeout = 3000;
private int WriteTimeout = 3000;

public bool IsConnected
{
get
{
try
{
if (socketClient != null && socketClient.Connected)
{
// 检测是否能够读写
if (socketClient.Poll(0, SelectMode.SelectRead))
{
byte[] checkConn = new byte[1];
if (socketClient.Receive(checkConn, SocketFlags.Peek) == 0)
{
// 0表示连接已关闭
return false;
}
}
return true;
}
}
catch
{
// 发生异常,认为连接不可用
return false;
}
return false;
}
}

public SocketClientHelper(string Ip, int port, int readTimeout = 3000, int writeTimeout = 3000)
{
RemoteIp = Ip;
RemotePort = port;
ReadTimeout = readTimeout;
WriteTimeout = writeTimeout;
}
public bool Connect()
{
try
{
socketClient?.Close();

socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketClient.Connect(RemoteIp, RemotePort);

socketClient.ReceiveTimeout = ReadTimeout;
socketClient.SendTimeout = WriteTimeout;

AutoConnect();
return true;
}
catch (Exception)
{
return false;
}
}

private void AutoConnect()
{
Task.Run(() =>
{
while (true)
{
if (IsConnected)
{
Thread.Sleep(1000);
Console.WriteLine("1");
continue;
}
else
{
if (Connect())
{
Console.WriteLine("ReConnect");
break;
}
else
{
Console.WriteLine("No Connect");
continue;
}
}
}
});
}

public void Close()
{
socketClient?.Close();
}

public int Send(string msg)
{
try
{
if (IsConnected)
{
var arr = Encoding.UTF8.GetBytes(msg);
var ret = socketClient.Send(arr);
return ret;
}
else
{
return 0;
}
}
catch (Exception)
{
return -1;
}
}

public string Receive()
{
try
{
if (IsConnected)
{
byte[] buffer = new byte[ReceiveBufferLength];
var len = socketClient.Receive(buffer);
var str = Encoding.UTF8.GetString(buffer);
return str;
}
else
{
return "";
}
}
catch (Exception)
{
return "";
}
}

public void ClearInputBuffer()
{
try
{
var len = socketClient?.Available;
if (len > 0)
{
var str = Receive();
Console.WriteLine($"清空缓存区数量{len}内容{str}");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}

posted @ 2026-09-09 16:10  武睿  阅读(3)  评论(0)    收藏  举报