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

相关文章

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

nginx长连接的问题

转自: http://www.360doc.com/content/12/1108/17/1073512_246644318.shtml

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP