C# Socket客户端采用双线程断网重连断线重连

  • 2021年07月15日 13:38:18更新
    • C# Socket服务端 双线程断网重连断线重连
    • C# Socket客户端采用双线程断网重连断线重连
    • 四、原代码地址

一、C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是刚开始笔者使用单线程起动与停止线程却没有做到理想的结果却给笔者一头的雾水。刚开始,用Socket类的Connected属性来实现,却发现行不通,connected只表示 是在上次 还是 操作时连接到远程主机。如果在这之后[连接的另一方]断开了,它还一直返回true,笔者使用Abort来终止线程得到的结果却是线程状态《ThreadState》被挂起为《Suspend》想进入到《Aborted》状态却永远做不到。在Socket客户端连接服务器有时因为断网或长时间收不到服务器消息就要重新连接服务端,笔者刚开始采用的是单线程连接结果用了所有的办法都达不到理想状态,于是想到了使用双线程连接结果达到了笔者所想要的结果。服务端采用心跳包发送数据。客户端用来检测发过来的数据。如果6秒钟检测不到数据就认为连接断开进行重新连接。效果如下图(一)所示:

网络断开重连如图(二)所示

二、双线程部分代码

 #region 线程一与线程二起动/**********************************************************************************************
* Author:   <杏雨>
* Create date: <2021年7月2日>
* Description:< 线程一,线程二起动方法 >
* 一、线程关闭使用Abort方法能在目标线程中抛出一个ThreadAbortException异常从而导致目标线程的终止。不过Abort方法被调用后,目标线程可能并不是马上就终止了。因为只要目标线程正在调用非托管的代码而且还没有返回的话,该线程就不会立即终止。而如果目标线程在调用非托管的代码而且陷入了一个死循环的话,该目标线程就根本不会终止。
*
* 二、只使用一个线程使用Abort方法关闭线程是关闭不了的,使用的结果是线程状态<ThreadState>将被挂起<Suspend()>永远进入不了  <Aborted>状态这一点作者已经验证。
*
* 三、本例使用双线程进行切换是结束线程的一个好方法。由于接收方法<ReceiveMsg()>接收服务端发送的消息是一个while循环 如果设置为TRUE将是一个死循环,一个死循环线程是无法退出的,所以在while循环中设置了开关<jumpLoopFlg>如果为FALSE while死循环才能退出,并在循环中设置一个检测jumpLoopFlg真假判断如果为假则退出循环。时钟是判断是否退出循环的唯一 方法 **********************************************************************************************/private void Thread_1_Start(){string strEroor = string.Format("服务器连接已断开,正在起动线程(1)重新链接...\r\n");AppendToText(strEroor);jumpLoopFlg = false;//先关循环client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);thCondition = 1;jumpLoopFlg = true;//然后在起动ConnectSocket(thCondition, PublicConts.ip, PublicConts.post);ThreadTime();string ipAdd = client.LocalEndPoint.ToString();string remote = client.RemoteEndPoint.ToString();string str = string.Format("线程(1)起动SocKet成功:本地地址:{0}服务器地址{1}", ipAdd, remote);AppendToText(str);Thread.Sleep(1000);}private void Thread_2_Start(){string strEroor = string.Format("服务器连接已断开,正在起动线程(2)重新链接...\r\n");AppendToText(strEroor);jumpLoopFlg = false;client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);thCondition = 2;jumpLoopFlg = true;ConnectSocket(thCondition, PublicConts.ip, PublicConts.post);ThreadTime();string ipAdd = client.LocalEndPoint.ToString();string remote = client.RemoteEndPoint.ToString();string str = string.Format("线程(2)起动SocKet成功:本地地址:{0}服务器地址{1}", ipAdd, remote);AppendToText(str);Thread.Sleep(1000);}#endregion

2021年07月15日 13:38:18更新

C# Socket服务端 双线程断网重连断线重连

1、修改了断网判断不准确的BUG
2、修改了运行2-4小时就假死机的现象,本次运行24小时不停机没有发现问题
3、增加了客户端心跳包的检测

C# Socket客户端采用双线程断网重连断线重连

1、修改了断网判断不准确的BUG
2、增加了服务器端故障检测与断网重连
3、增加了对服务器端心跳包的检测
4、服务器端故障检测采用双线程中的一个线程进行检测。以前采用新开一个Socket进行重新连接,连接成功后在删除这个Socket这样会造成服务器端的繁忙删除
5、服务器端与客户端进行了24小时不停机测试现在没有发现问题,以前半小时后或2-4小时就会断线重连主要原因是断网的误判造成。这次增加了对心跳包检测

三、下图是客户端先开,然后在开服务器端的效果图,一般情况下是先开服务器端在开客户端,否则就会出现异常,由于作者对客户端增加了服务器端的错误检测所以在后开服务器也没有什么问题。由于是双线程当一个线程连接出现故障系统会自动切换到另一个线程继续工作。

四、原代码地址

1、 服务端:https://download.csdn.net/download/weixin_43727933/20059245
2、客户端:https://download.csdn.net/download/weixin_43727933/20058707

C# Socket客户端采用双线程断网重连断线重连)相关推荐

  1. 天天炫斗服务器维修,【天天炫斗】弱网处理及断线重连方案

    [天天炫斗]弱网处理及断线重连方案 --hessionhe 一背景及问题描述 天天炫斗采用的是TCP长连接方式,消息交互使用的是TDR方案,弱网问题以及断线重连的情况在手游运营中都是非常普遍的,也会相 ...

  2. Netty客户端断线重连实现及问题思考

    点击关注公众号,利用碎片时间学习 前言 在实现TCP长连接功能中,客户端断线重连是一个很常见的问题,当我们使用netty实现断线重连时,是否考虑过如下几个问题: 如何监听到客户端和服务端连接断开 ? ...

  3. 微信小程序开发01 双线程模型:为什么小程序不用浏览器的线程模型?

    你好,我是俊鹏,今天是第一节课,我想和你聊一聊微信小程序表层知识中的双线程模型.主要探讨一下它的技术背景.线程间的分工和通信模式. 在工作以及一些技术分享中,我经常被人问到这样一个问题:"微 ...

  4. 客户端异常断网断电,服务端该如何感知?

    本文只针对于web项目.开始想的是使用websocket进行长连接服务,但有个问题就来了,客户端异常断电.异常断网,比如说我现在把电脑炸了,网线掐了,服务端是不知道的,所以无法触发oncolse方法, ...

  5. python socket TCP协议断网重连

    最近做了个基于树莓派(Linux系统)的客户端.客户端需要把温湿度数据传到服务器上,每次传输约300个传感器的数据,大约3000个字节,我选用了Python的socket模块,完成这个项目时,最大的阻 ...

  6. Android:Socket客户端开发,Android 的Socket客户端优化,Android非UI线程修改控件程序崩溃的问题

    一.Android:Socket客户端开发 创建一个工程 我们要做的是按下按键之后,去往服务器 (服务器) 或者我们自己写的服务器 ,给他发送一些预定好的东西 然后打开操作界面 然后修改一下 你要发送 ...

  7. 阿里突遭断网断电!双11最惊险一幕刚刚曝光

    雷刚 发自 凹非寺   量子位 报道 | 公众号 QbitAI 2020年11月11日晚,又一年天猫双11狂欢接近尾声. 新交易纪录.新流量峰值,一切都是十全十美的样子. 此时,阿里巴巴CTO程立(鲁 ...

  8. 阿里双11突遭断网断电!最惊险一幕刚刚曝光

    2020年11月11日晚,又一年天猫双11狂欢接近尾声. 新交易纪录.新流量峰值,一切都是十全十美的样子. 此时,阿里巴巴CTO程立(鲁肃)才将一段实录视频公之于众-- 11月5日凌晨,阿里技术上下完 ...

  9. Dr.com客户端提示“使用代理软件”并断网怎么解决?

    客户端提示"使用代理软件"并断网怎么解决?   现象:提示格式为"发现你正在使用以下代理软件:[代理软件],请停止使用路由器或代理软件上网并重新登录",然后网络 ...

最新文章

  1. 神经网络与机器学习 笔记—时序模式、非线性滤波
  2. SSIS中的容器和数据流—调试工具数据视图
  3. 程序员应该了解的几个接单平台,私活,码农!
  4. Unicode数据类型(与ANSI关系和相互转化)
  5. js中typeof与instanceof用法小记
  6. 关于CreadThread()与CloseHandle()
  7. 小米 samba linux,U-BOOT移植准备之(一)Samba服务器
  8. ajax 七牛云上传图片,学习笔记:利用七牛云上传图片小结
  9. 一张图架构示意图及简单分析
  10. 插桩valgrind_基于动态插桩的CC++内存泄漏检测工具的设计与实现.pdf
  11. 阿里云个人站点基于nginx代理搭建https协议支持
  12. 【上位机与下位机通信】使用WIFI模块ESP8266连接单片机与上位机通信
  13. 从零学习Fluter(四):Flutter中ListView组件系列详展
  14. 蓝桥杯 回文日期(Java)
  15. 能被9和11整除的数的特征
  16. 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
  17. 读书笔记:《经验的疆界》
  18. AI:2020北京智源大会与五位图灵奖得主和100多位专家《共同探讨人工智能的下一个十年》——6月21日~6月24日的日程安排(实时更新,建议收藏)
  19. Golang深入理解GPM模型
  20. 【数据可视化】贾跃亭和恒大对战:他的商业帝国梦是最后的狂欢还是东山再起?...

热门文章

  1. sqlserver位数不够左边补0
  2. 解决:Uncaught (in promise) TypeError: Failed to fetch 的问题
  3. oracle的package是什么意思,Oracle的Package的作用及用法
  4. dev c++ 中的Program received signal SIGSEGV Segmentation fault
  5. 基础化工行业报告:国内盐湖提锂产业进程加速,产业链有望受益
  6. SSL证书绑定了顶级域名后二级域名还需再申请吗
  7. steps 步骤条中插入自定义描述description
  8. 陈老师排课软件12A(正式版)
  9. C语言——一元多项式定义求和 [单链表] (数据结构)
  10. 【英语天天读】优秀的标准