关于C# TCP断线重连的问题 百度谷歌后未能找到到满意答案 接着昨天的帖子
static void Main(string[] args)
{
StarMain();
}
public static void StarMain()
{
foreach (Address address in Common.GetAddress())
{
ThreadPool.QueueUserWorkItem(h => SocketClient(address.IP, address.Port));
Thread.Sleep(10);
}
Console.ReadLine();
}
/// <summary>
/// 程序开始
/// </summary>
public static void SocketClient(string host, int port)
{
try
{
ByteQueue queue = new ByteQueue();
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipe);
Console.WriteLine(ip + " Connected......");
while (true)
{
//建立缓冲区
byte[] recByte = new byte[4096];
int bytes = socket.Receive(recByte, recByte.Length, 0);
//分多次接收
byte[] reallData = new byte[bytes];
Array.Copy(recByte, reallData, reallData.Length);
queue.Enqueue(reallData);
//while可处理同时接收到多个包 防止一帧数据不是完整的包
while (queue.Find())
{
byte[] readBuffer = queue.Dequeue();
//解析雷达数据 包含平均速度/占有率/车流量
string data = BitConverter.ToString(readBuffer);
if (data.StartsWith("FF-FF-FF-FF-CA-CB-CC-CD") && data.EndsWith("EA-EB-EC-ED"))
{
GetData(data, host, port, DateTime.Now);
}
else if (data.StartsWith("0A 0B 0C 0D") && data.EndsWith("EA EB EC ED"))//历史数据
{
Regex regex = new Regex("0A 0B 0C 0D.{21}");
MatchCollection matches = regex.Matches(data, 0);
if (matches.Count > 0)
{
foreach (Match nextmach in matches)
{
string history = nextmach.Value;
string[] strTime = history.Split(' ');
string year = strTime[0] + strTime[1];
string moth = strTime[2];
string day = strTime[3];
string hh = strTime[4];
string mm = strTime[5];
string ss = strTime[6];
DateTime time = Convert.ToDateTime(year + "-" + moth + "-" + day + " " + hh + ":" + mm + ":" + ss);
GetData(data, host, port, time);
}
}
}
else
{
Console.WriteLine(data);
}
}
}
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e.Message);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e.Message);
System.Timers.Timer t = new System.Timers.Timer(1000); //实例化Timer类,设置间隔时间为10000毫秒;
t.Elapsed += new System.Timers.ElapsedEventHandler(theout); //到达时间的时候执行事件;
t.AutoReset = true; //设置是执行一次(false)还是一直执行(true);
t.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件;
}
}
public static void theout(object source, System.Timers.ElapsedEventArgs e)
{
StarMain();
}
相关推荐
C#实现TCP客户端断线重连与心跳检测的工业级解决方案
在网络编程中,TCP协议提供了可靠的字节流传输,但其底层连接状态管理存在局限性。当物理链路中断或网络波动时,操作系统TCP协议栈的保活机制响应延迟可能长达数分钟,无法满足实时性要求高的应用场景。为解决这一问题,开发者需要在应用层实现主动健康检测机制,通过心跳包定期验证连接活性,结合指数退避算法实现智能重连,从而提升系统鲁棒性。这种技术方案在物联网设备通信、金融交易系统、工业控制等需要稳定长连接的领域具有重要价值。本文以C#为例,详细解析如何构建具备快速断线感知和自动恢复能力的TCP客户端,其中涉及双保险策略
C#上位机与PLC通信:断线重连、数据补传与协议容错设计(工业级实战)
断线重连模块:基于指数退避策略,快速检测并恢复连接,保障通信连续性;数据补传模块:通过“PLC归档+本地缓存”双渠道,确保断线期间数据不丢失;协议容错模块:处理粘包/分包、校验失败、数据异常等问题,提升系统鲁棒性。该方案适配主流PLC(西门子、三菱、松下等)和Modbus RTU/TCP协议,可直接集成到WPF/WinForm/控制台项目中,支持7×24小时稳定运行。多PLC管理:扩展客户端支持多台PLC同时通信,统一管理重连与补传;
C# TCP通讯实战:从粘包处理到断线重连的完整指南
TCP/IP网络通讯是工业物联网与上位机开发的重要基础,其设计质量直接决定数据采集与设备控制的实时性和可靠性。由于TCP是流式协议,报文在传输中常发生粘包、半包现象,且设备断电、网络波动会导致连接中断,这是工程实践中无法回避的挑战。理解通讯流程的五个关键环节,掌握长度前缀、心跳检测与断线重连等机制,才能构建稳定高效的通讯程序。结合C#语言的异步编程模型,可以优雅地处理后台数据接收与界面更新,有效避免循环数据采集时的UI卡顿问题,同时应对扫码枪触发事件等高频异步上报场景。本文围绕C# TCP通讯示例,从协议原
C# TCP通信完整源码:从粘包处理到断线重连的实战指南
在工业自动化和设备对接场景中,上位机与下位机之间的数据交互往往依赖TCP协议。很多开发者初次接触Socket编程时,常被异步模型、粘包半包、断线重连等基础问题困扰,尤其是使用C#开发时,网络上的示例代码大多停留在同步阻塞或单连接层面,难以直接用于真实项目。理解TCP作为流式协议的本质,是解决数据边界问题的前提;而采用async/await异步模型,则能有效避免线程阻塞,提升通信效率。通过合理设计应用层帧格式、实现消息拆包与重连机制,可以构建稳定可靠的通信底层,支撑PLC数据采集、扫码枪接入、设备状态上报等典
C#实现SICK RFID读卡器TCP异步通信:从协议解析到断线重连实践
从工业物联网通信基础出发,讨论TCP/IP网络编程在设备数据采集中的核心作用,特别是异步I/O模型如何解决上位机界面卡顿与并发连接问题。RFID技术作为自动识别关键手段,在产线追溯、AGV调度等场景中广泛应用,其读卡器通常以TCP服务端形式暴露数据接口。实际开发中,半包粘包处理、心跳保活与断线重连是稳定通信的三大难点。本文结合SICK RFID读卡器实例,讲解基于C#的异步TCP客户端实现,涵盖XML报文解析、缓冲切帧、看门狗机制等工程化方案,为工业上位机开发者提供可落地的参考。


