C#中Tcp断线重连的两种方法

news2024/10/8 17:38:26

 方法一

 Socket client;
 Task.Run(async () =>
    {
        try
        {
            int index = 0;
            while (true)
            {
                index++;
                await Task.Delay(1000);
                client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                var result = client.BeginConnect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666), null, null);
                bool state = result.AsyncWaitHandle.WaitOne(1000);// 为什么   卡   20秒
                                                                  // state : 异步动作在1秒时间内完成  
                if (client.Connected)
                {
                    client.EndConnect(result);// EndConnect不代表断开连接  ,结束这个异步对象
                    Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")}-{DateTime.Now.Millisecond.ToString("000")}  [{index.ToString("000")}]  连接成功");
                }
                else
                {
                    // 连接销毁  
                    Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")}-{DateTime.Now.Millisecond.ToString("000")}  [{index.ToString("000")}]  连接失败");
                }
                client.Dispose();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    });

 方法二

  // 拿到最新的状态 
  Socket socket = new Socket(
      AddressFamily.InterNetwork,
      SocketType.Stream,
      ProtocolType.Tcp);

  // 三次握手
  socket.Connect(new IPEndPoint(IPAddress.Parse("192.168.2.1"), 102));
  // 物理线路的断开
  // 上位机应用 -------------> PLC
  // 上位机应用 --------路由器/交换机 -----(断连)---->  PLC
  //     第二种情况解决方案:心跳    请求 I0.0(不同的PLC不同处理)->响应false
  //                 Send  ->  Receive(超时处理)  超时N次时  判断失联
  //                 单独线程  10秒钟执行一次
  Console.WriteLine(socket.Connected);// 保留最后一次操作时的状态,不是实时的状态 

  while (true)
  {
      // 心跳请求
      Thread.Sleep(1000);
      bool state = !(!socket.Connected || (socket.Poll(1, SelectMode.SelectRead) && socket.Poll(1, SelectMode.SelectWrite) && (socket.Available == 0)));// 返回True   :连接正常
      if (state)
      {
          Console.WriteLine("连接正常");
          socket.Shutdown(SocketShutdown.Both);
          socket.Dispose();
      }
      else
      {
          Console.WriteLine("连接断开");
          socket = new Socket(
                 AddressFamily.InterNetwork,
                 SocketType.Stream,
                 ProtocolType.Tcp);
          try
          {
              // 大概20秒时间
              socket.Connect(new IPEndPoint(IPAddress.Parse("192.168.2.1"), 102));
          }
          catch (Exception ex)
          {
              Console.WriteLine("重新连接失败");
              Console.WriteLine(ex.Message);
          }
          var result = socket.BeginConnect(new IPEndPoint(IPAddress.Parse("192.168.2.1"), 102), new AsyncCallback(r =>
          {
              // 
              Console.WriteLine(r.AsyncState);
              if (!r.IsCompleted)   // 连接请求的动作 执行完成    不包括连接状态
                  socket.EndConnect(r);
              Console.WriteLine("回调执行");
          }), null);
          bool s = result.AsyncWaitHandle.WaitOne(1000);
          if (s)// 连接成功后
          {
              Console.WriteLine("重新连接");
          }
          else
          {
              // 连接的时候  异步,在1秒钟时间内   没有连接成功   跳出
              try
              {
                  socket.EndConnect(result); // 销毁之前的连接请求    卡线程
              }
              catch (Exception ex)
              {
                  Console.WriteLine(ex.Message);
              }
              Console.WriteLine("重连失败");
          }
      }
      //重连  使用    发送业务请求  执行连接判断    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT助力文献综述写作:提升效率与写作技巧!

文献综述在论文写作中占有举足轻重的地位。它不仅帮助我们梳理已有的研究成果,还能为自己的研究奠定基础。许多同学在撰写文献综述时常常感到头疼:如何处理海量的信息?如何将不同的观点有条理地整合起来?再加上学术语言的高要求&a…

定时任务。

引入 1.启动类上加上注解 2.新建一个定时任务的管理类,交给Spring管理 案例 案例1:fixedRate //上次任务开始到下次任务开始的时间间隔为5秒 //每隔5秒执行一次,不需要等上个任务执行完 Scheduled(fixedRate 5000) public void mask01() throws Inte…

python:web自动化工具selenium安装和配置(1)

UI自动化测试 UI自动化测试(User Interface Automation Testing)是一种通过编写脚本或使用自动化测试工具,对界面(UI)进行自动化测试的方法。原理主要是模拟用户打开客户端或网页的UI界面,自动化执行用户界…

【Java 问题】基础——泛型

接上文 泛型 47.Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符? 47.Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符? 什么是泛型? Java 泛型(generics)是…

REINFORCEMENT LEARNING THROUGH ACTIVE INFERENCE

摘要 强化学习(RL)的核心原则是智能体寻求最大化累积奖励之和。相比之下,主动推理,认知和计算神经科学中的一个新兴框架,提出代理人采取行动,以最大限度地提高有偏见的生成模型的证据。在这里,…

上门安装维修系统小程序开发详解及源码示例

随着智能家居和设备的普及,消费者对上门安装和维修服务的需求日益增加。为了满足这一市场需求,开发一款上门安装维修系统小程序成为了一种有效的解决方案。本文将详细介绍上门安装维修系统小程序的开发过程,并提供一个简单的源码示例&#xf…

人工智能的未来

引言 人工智能的未来发展将是科技与人类社会深度融合的过程。随着技术的不断进步,AI将在全球经济、文化、政治及道德伦理等领域产生深远影响。本文将探讨人工智能在未来可能的技术进步、应用领域、社会影响、伦理挑战,以及对全球未来的展望。 一、技术前…

数据结构之——二叉树

一、二叉树的基本概念 二叉树是数据结构中的重要概念,每个节点最多有两个子树,分别为左子树和右子树。这种结构具有明确的层次性和特定的性质。 二叉树有五种基本形态: 空二叉树:没有任何节点。只有一个根结点的二叉树&#xff…

【HTTPS】深入解析 https

我的主页:2的n次方_ 1. 背景介绍 在使用 http 协议的时候是不安全的,可能会出现运营商劫持等安全问题,运营商通过劫持 http 流量,篡改返回的网页内容,例如广告业务,可能会通过 Referer 字段 来统计是…

kubernetes get pods的STATUS字段显示ImagePullBackOff 的解决办法

问题: [rootmaster ingress]# kubectl -n ingress-nginx get pods NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-mcrc6 0/1 ImagePullBackOff 0 37m ingress-…

掌握RocketMQ——基本概念和系统架构

简述RcoketMQ 概念:RocketMQ是一个开源的分布式消息中间件,由阿里巴巴开发并贡献给Apache软件基金会。它用于处理高吞吐量、低延迟的消息传递,并广泛应用于现代分布式系统中。 1 基本概念 1.1 消息 (Message) 概念:消息是信息传…

自定义协议以及序列化和反序列化

我们知道TCP是全双工的,可以同时进行发收,因为他有一个发送缓冲区和一个接收缓冲区 我们使用write其实是把数据拷贝到发送缓冲区,使用read接收缓冲区的数据,其实是把数据拷贝到文件缓冲区里,发送的过程中,我…

脸书(Facebook)高效开发国外客户的6个技巧

Facebook作为全球使用人数最多的社媒平台,全球三分之一的人都在用。做外贸的话基本上是必须要去掌握的一个平台,因为通过Facebook是可以开发到很多其他渠道平时开发不到的优质客户的。 Facebook跟LinkedIn不同,LinkedIn比较偏向于大B的客户&…

传热学一些“数”和意义

物体单位面积上的导热热阻/单位表面积上的对流换热热阻 无量纲时间 Nu与Bi的表达式相同,但是意义是无量纲的h。它们表达式里的长度取值不同,比如同样一个平板,Bi的L是厚度,Nu是长度,因为Bi面向固体,λ为固…

八种基本服务器类型,看这篇完全够了

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 上午好,我的网工朋友。 服务器作为网络基础设施的核心组件,其重要性不言而喻。 无论是个人空间还是大型企业的数据中心&…

激波是什么?

你肯定能听懂。激波,激烈的波,代表特征:激波扫过你时,重则五脏震动,支离破碎。轻则耳膜震动,隆隆作响,当然也有相对你而言尺度很小的激波,没啥伤害。 所以激波,和相对于…

【VScode】VScode如何离线安装扩展

VScode如何离线安装扩展 一,简介二,操作步骤2.1 扩展下载2.2 扩展安装 三,总结 一,简介 本文以“C/C Extension Pack”扩展为例,介绍如何在没有网络的环境下给VScode安装扩展,供参考。 二,操作…

gradle.properties的注释乱码的解决方案

问题描述: gradle项目的配置脚本的注解出现乱码:(#?????) gradle.properties #??? PRODSERVER2193.168.0.22 解决方案:(3步) 增…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(上)

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 本文章是基于瑞芯微RK3568芯片的DAYU200开发板,进行标准…

解决AWS Organizatiion邀请多个Linker账号数量限额问题

文章目录 情景再现什么是 AWS Organizations?操作步骤完整支持工单截图参考链接 情景再现 冷知识:默认情况下,一个组织中允许的原定设置最大账户数为10个。新创建的账户和组织的限额可能会低于默认的 10 个账户。 现在需要用一个AWS账号&…