C# TCP/IP 异步Socket 断线重连的问题

tom123gzk tom123gzk 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近一直在研究Socket ,完成了同步之后在异步的过程中遇到了一个问题,2天了一直没有解决。

问题描述:
要求灵活性比较高例如 1.客户端服务端不分顺序,任意顺序打开要求能连接上(打开程序就连接,不需要按钮)。
2.在连接过程中,如果关闭客户端,重启客户端(服务端不做任何操作),自动连接上。
3.在连接过程中,如果关闭服务器,重启服务器(客户端不做任何操作),自动连接上。

其中,第1个第2个都已经解决,针对第3个问题,我的客户端检测到断开后,一直循环重连直到再次连接上,但是实际情况上,客户端的循环要多执行一次,每次都会导致连接上2个,同一个IP不同的端口(其实只有一个客户端)如下图:


部分代码如下:

private void Connect()
{
Thread tConnect = new Thread(new ThreadStart(ConnectServer));
tConnect.IsBackground = true;
tConnect.Start();
}

private void ConnectServer()
{
MsgBuffer = new Byte[65535];
int timeStart = System.Environment.TickCount;
IPAddress ipAddress = IPAddress.Parse("192.168.6.93");
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 1022);
bool bChange = false;
while (true)
{
if (!bConnection)
{
try
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);
connectDone.WaitOne();
}
catch (Exception)
{
if (!bChange)
{
this.Invoke((EventHandler)(delegate
{
txtRcv.Text = "连接服务器失败,请确认服务器是否正常工作!";
pictureBox1.Image = Image.FromFile(".\\pic\\bullet_red.png");
}));
bChange = true;
}
continue;
}
}
else
{
break;
}
t = new Thread(o => Thread.Sleep(500));
t.Start(this);
while (t.IsAlive)
{
Application.DoEvents();
}
}
}
private void ConnectCallback(IAsyncResult ar)
{
try
{
client.EndConnect(ar);
connectDone.Set();
MsgBuffer = new Byte[65535];
client.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallback), client);
this.Invoke((EventHandler)(delegate
{
bConnection = true;
bFirst = true;
txtRcv.Text = "已连接上服务器";
pictureBox1.Image = Image.FromFile(".\\pic\\bullet_green.png");
}));
receiveDone.WaitOne();
}
catch (Exception)
{
if (!bchange)
{
this.Invoke((EventHandler)(delegate
{
txtRcv.Text = "连接服务器失败,请确认服务器是否正常工作!";
pictureBox1.Image = Image.FromFile(".\\pic\\bullet_red.png");
}));
bchange = true;
}
if (!bFirst) ConnectServer();
}
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
this.Invoke((EventHandler)(delegate
{
string strTemp = Encoding.ASCII.GetString(MsgBuffer, 0, bytesRead);
txtRcv.Text = strTemp;
ShowData(strTemp);
}));
client.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallback), client);
}
else
{
receiveDone.Set();
}
}
catch (Exception)
{
this.Invoke((EventHandler)(delegate
{
bConnection = false;
bFirst = true;
txtRcv.Text = "连接服务器失败,请确认服务器是否正常工作!";
pictureBox1.Image = Image.FromFile(".\\pic\\bullet_red.png");
}));
//client.Close();
//client = null;
ConnectServer();
}
}
...全文

相关推荐

C#与Android Socket通信

以上是C#和Android间Socket通信的基本原理和实现方式,实际开发中还需要根据具体业务需求进行调整优化,例如数据序列化、心跳检测、断线重连等功能。

yyxmm

C# TCP通信完整源码:从粘包处理到断线重连的实战指南

在工业自动化和设备对接场景中,上位机与下位机之间的数据交互往往依赖TCP协议。很多开发者初次接触Socket编程时,常被异步模型、粘包半包、断线重连等基础问题困扰,尤其是使用C#开发时,网络上的示例代码大多停留在同步阻塞或单连接层面,难以直接用于真实项目。理解TCP作为流式协议的本质,是解决数据边界问题的前提;而采用async/await异步模型,则能有效避免线程阻塞,提升通信效率。通过合理设计应用层帧格式、实现消息拆包与重连机制,可以构建稳定可靠的通信底层,支撑PLC数据采集、扫码枪接入、设备状态上报等典

Project Moto

C# TCP工业级可靠传输实战:PLC/边缘节点/扫码枪多设备毫秒级通信,断线重连+心跳+CRC校验+消息队列全搞定

摘要: 本文针对工业TCP通信中的常见痛点(网络波动断线、数据丢失、篡改风险、离线检测困难),提出了一套基于C#的稳定通信架构。通过异步Socket+消息队列+断线重连+CRC32校验+心跳检测的四层解耦设计,实现了10台边缘节点与服务器的可靠通信。核心协议采用二进制帧结构(含设备ID、消息序列、CRC校验等),确保数据完整性与可追溯性。该方案在某汽车线束厂实际应用中达到零数据丢失、28ms平均延迟的效果,成本仅2万元,为工业物联网通信提供了高性价比的解决方案。

威哥说编程

C# Socket实战:心跳、断线重连与粘包处理完整方案

TCP是面向流的传输协议,实际网络通信中数据没有天然边界,如何可靠地切分消息、感知连接状态,是Socket编程的核心挑战。基于TCP/IP原理,应用层需要自行设计消息帧格式、心跳保活与重连策略。这套方案的技术价值在于,通过长度前缀法解决粘包问题,用应用层心跳检测死链,以指数退避实现稳健的断线重连,同时以异步接收支撑多客户端并发场景。在设备数据采集、上位机与局域网通信等工程实践中,原生Socket不依赖第三方库,具备完全可控的字节级解析能力,是构建稳定通信底座的优选。围绕C# Socket开发,从TCP流式传

投研帮

c#-TCP-IP通信-服务端实例.rar

心跳机制可以防止网络延迟或断开连接导致的数据丢失;数据编码解码可能需要考虑到不同字符集和数据格式;错误恢复则包括重试策略、断线重连等。

技外李四
评论 19
收藏 已收藏
分享
返回顶部
tom123gzk
C# 111,128 成员 642,537 内容