TCP 连接掉线自动重连

2024-02-01 21:44
文章标签 连接 自动 tcp 重连 掉线

本文主要是介绍TCP 连接掉线自动重连,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • TCP 连接掉线自动重连
      • 定义
      • 使用
      • 连接效果

TCP 接收数据时防止掉线。TCP 连接掉线自动重连。多线程环境下TCP掉线自动重连。
欢迎讨论更好的方法!

TCP 连接掉线自动重连

定义

定义一个类,以编写TCP连接函数Connect(),并且:

初始化时保存TCP连接的基本信息,在重连时不需要再次输入参数;
编写自动重连函数TryToConnect()

internal class Receiver
{private Socket clientConn;private string ip, myIP;private int port;private EndPoint point, myPoint;/// <summary>/// 需要使用锁来防止多线程抢连/// </summary>private Mutex mutexConnect = new Mutex(false, "MutexForConnect");/// <summary>/// 与交互的执行者/// </summary>/// <param name="myIP">本地ip地址字符串</param>/// <param name="ip">ip地址字符串</param>/// <param name="port">端口号</param>public Receiver(in string myIP, in string ip, in int port){// 保存记录this.myIP = myIP;this.ip = ip;this.port = port;// 设置连接myPoint = new IPEndPoint(IPAddress.Parse(myIP), 0);    // 本地IP,0表示任意端口point = new IPEndPoint(IPAddress.Parse(ip), port);     // 服务器的地址}/// <summary>/// 对Connect函数加锁(因为有多个线程需要连接,会报错)/// </summary>/// <returns>若连接成功则返回socket对象,否则返回空</returns>public Socket TryToConnect(){// 如果已连接,直接返回了。if (!(clientConn is null) && clientConn.Connected) return clientConn;mutexConnect.WaitOne();             // 阻塞,每次连接一个。等进入者释放锁再进。// 如果刚才未连接,但是另一个【进入进程】先connect了,那就返回了。if (!(clientConn is null) && clientConn.Connected) return clientConn;bool flag = Connect();              // 【进入进程】发起连接Thread.Sleep(1000);                 // 防止过于频繁的连接,每秒进一个mutexConnect.ReleaseMutex();        // 【进入进程】释放锁return flag ? clientConn : null;    // 若连接成功则返回socket对象,否则返回空}/// <summary>/// 建立与服务器的TCP/IP连接/// </summary>/// <returns>成功返回true,反之返回false</returns>public Boolean Connect(){Console.Write($"({ip} {port}) 连接中...");//创建一个新的Socket对象clientConn = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 建立TCP / IP连接try{clientConn.Bind(myPoint);         //绑定本地IP,多IP防止串(若无此IP则可能抛出异常)                            clientConn.Connect(point);        //尝试连接Console.WriteLine("连接成功");return true;}catch (Exception){Console.WriteLine("连接失败");clientConn.Close();clientConn.Dispose();return false;}}
}

使用

此处仅用主线程模拟。但实际上,多个线程使用连接语句也是OK的。

static void Main(string[] args)
{Receiver receiver = new Receiver(myIP: "192.168.100.10", ip: "192.168.100.1", port: 2003);// 连接Socket conn = null;while (conn is null) conn = receiver.TryToConnect();    // 如果没连上,就阻塞(因为不连上就无法进行后续工作)// 接收数据int toReadLen = 20;                                 	// 准备接收的byte数据长度byte[] rawData = new byte[toReadLen];               	// 接收数据的byte数组int len = conn.Receive(rawData, 0, toReadLen, SocketFlags.None);            // 接收到扫码器传来的信息while (len < toReadLen)len += conn.Receive(rawData, len, toReadLen - len, SocketFlags.None);   // 不足时,继续接收直到指定长度// 此处用于处理接收到的信息Console.WriteLine(BitConverter.ToString(rawData, 0, len));Console.ReadLine();
}

连接效果

在这里插入图片描述

这篇关于TCP 连接掉线自动重连的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/668568

相关文章

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

IDEA连接达梦数据库的详细配置指南

《IDEA连接达梦数据库的详细配置指南》达梦数据库(DMDatabase)作为国产关系型数据库的代表,广泛应用于企业级系统开发,本文将详细介绍如何在IntelliJIDEA中配置并连接达梦数据库,助力... 目录准备工作1. 下载达梦JDBC驱动配置步骤1. 将驱动添加到IDEA2. 创建数据库连接连接参数

Python Excel实现自动添加编号

《PythonExcel实现自动添加编号》这篇文章主要为大家详细介绍了如何使用Python在Excel中实现自动添加编号效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍简单的说,就是在Excel中有一列h=会有重复

Springboot的自动配置是什么及注意事项

《Springboot的自动配置是什么及注意事项》SpringBoot的自动配置(Auto-configuration)是指框架根据项目的依赖和应用程序的环境自动配置Spring应用上下文中的Bean... 目录核心概念:自动配置的关键特点:自动配置工作原理:示例:需要注意的点1.默认配置可能不适合所有场景