Unity中Socket_TCP异步连接,加入断线检测以及重连功能
1、服务端
using System;
using System.Collections.Generic;
using System.Text;
#region 命名空间
using System.Net;
using System.Net.Sockets;
using System.Threading;
using UnityEngine;
#endregionnamespace AsynServerConsole
{/// <summary>/// Tcp协议异步通讯类(服务器端)/// </summary>public class AsynTcpServer: MonoBehaviour{//存储已连接的客户端的泛型集合private static Dictionary<string, Socket> socketList = new Dictionary<string, Socket>();private void Start(){StartListening();}float ttt;private void Update(){ttt += Time.deltaTime;if (ttt>5f){ttt = 0f;//Debug.Log("连接数量==="+ socketList.Count);if (socketList.Count > 0){foreach (var item in socketList){// Debug.Log("连接客户端====" + item.Key);// HandleClient(item.Value);//AsynSend(item.Value,"心跳");}}else {}}}Socket TcpServer;#region Tcp协议异步监听/// <summary>/// Tcp协议异步监听/// </summary>public void StartListening(){//主机IPIPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("192.168.15.72"), 8686);TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);TcpServer.Bind(serverIp);TcpServer.Listen(100);Debug.Log("异步开启监听...");AsynAccept(TcpServer);}#endregion#region 异步连接客户端/// <summary>/// 异步连接客户端/// </summary>/// <param name="tcpServer"></param>public void AsynAccept(Socket tcpServer){tcpServer.BeginAccept(asyncResult =>{Socket tcpClient = tcpServer.EndAccept(asyncResult);string str = tcpClient.RemoteEndPoint.ToString();socketList.Add(str, tcpClient);Debug.Log("收到连接=============" + tcpClient.RemoteEndPoint.ToString());AsynSend(tcpClient, "收到客户端连接...");//发送消息AsynAccept(tcpServer);//继续监听客户端AsynRecive(tcpClient);//继续监听客户端消息}, null);}#endregion#region 异步接受客户端消息/// <summary>/// 异步接受客户端消息/// </summary>/// <param name="tcpClient"></param>public void AsynRecive(Socket tcpClient){byte[] data = new byte[1024];try{tcpClient.BeginReceive(data, 0, data.Length, SocketFlags.None,asyncResult =>{int length = tcpClient.EndReceive(asyncResult);if (length==0){Debug.Log("客户端退出===="+tcpClient.RemoteEndPoint.ToString());foreach (var item in socketList){if (item.Key.Contains(tcpClient.RemoteEndPoint.ToString())){socketList.Remove(item.Key);}}return;}Debug.Log(tcpClient.RemoteEndPoint.ToString()+"收到客户端消息:{length}=====" + length + "___" + Encoding.UTF8.GetString(data)); AsynSend(tcpClient, "收到客户端消息...");AsynRecive(tcpClient);}, null);}catch (Exception ex){Debug.Log("异常信息:" + ex.Message);}}#endregion#region 异步发送消息/// <summary>/// 异步发送消息/// </summary>/// <param name="tcpClient">客户端套接字</param>/// <param name="message">发送消息</param>public void AsynSend(Socket tcpClient, string message){byte[] data = Encoding.UTF8.GetBytes(message);try{tcpClient.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult =>{//完成发送消息int length = tcpClient.EndSend(asyncResult);Debug.Log("服务端完成发送消息=====" + length+"___" +message);}, null);}catch (Exception ex){Debug.Log("发送消息异常信息=====" + ex.Message);}}#endregionprivate void HandleClient(Socket clientSocket){byte[] buffer = new byte[1024];try{int bytesRead = clientSocket.Receive(buffer);if (bytesRead > 0){// 处理接收到的数据Debug.Log("Received: {0}" + Encoding.ASCII.GetString(buffer, 0, bytesRead));}else{// 客户端正常关闭连接Debug.Log("Client closed the connection.");}}catch (SocketException se){// 处理客户端断开连接的情况Debug.Log($"Socket error: {se.Message}");}finally{// 关闭SocketclientSocket.Close();}}private void OnDestroy(){Debug.Log(socketList.Count);foreach (KeyValuePair<string, Socket> item in socketList){item.Value.Dispose();item.Value.Close();}if (TcpServer.Connected){TcpServer.Shutdown(SocketShutdown.Both);}TcpServer.Dispose();TcpServer.Close();}[ContextMenu("客户端数量")]public void DebugClientCount() {Debug.Log("连接数量===" + socketList.Count);}}
}
相关文章:
Unity中Socket_TCP异步连接,加入断线检测以及重连功能
1、服务端 using System; using System.Collections.Generic; using System.Text; #region 命名空间 using System.Net; using System.Net.Sockets; using System.Threading; using UnityEngine; #endregionnamespace AsynServerConsole {/// <summary>/// Tcp协议异步通…...
Android build子系统(01)Ninja构建系统解读
说明:本文将解读Ninja构建系统,这是当前Android Framework中广泛使用的构建工具。我们将从Ninja的起源和背景信息开始,逐步解读Ninja的优势和核心原理,并探讨其一般使用场景。然后介绍其在Android Framework中的应用及相关工具&am…...
徐老师的吉祥数
题目背景 文件读写 输入文件avoid.in 输出文件avoid.out 限制 1000ms 512MB 题目描述 众所周知, 3这个数字在有些时候不是很吉利,因为它谐音为 “散” 所以徐老师认为只要是 3的整数次幂的数字就不吉利 现在徐老师想知道,在某个范围[l,r] …...
使用html写一个能发起请求的登录界面
目录 head部分 内联样式部分 body部分 login-form类的div myModal类的div id script部分 总的代码 界面与操作演示 <!DOCTYPE html> <html lang"en"> <!DOCTYPE html> 这是文档类型声明,告诉浏览器这是一个 HTML文档。 <…...
五子棋双人对战项目(2)——登录模块
目录 一、数据库模块 1、创建数据库 2、使用MyBatis连接并操作数据库 编写后端数据库代码 二、约定前后端交互接口 三、后端代码编写 文件路径如下: UserAPI: UserMapper: 四、前端代码 登录页面 login.html: 注册页面…...
几种操作系统和几种cpu
常见的操作系统:windows,linux,macOS,统信,deepin,raspberry,andriod,iOS,鸿蒙,等等。 常见的cpu:intel,amd,龙芯&#x…...
[Cocoa]_[初级]_[使用NSNotificationCenter作为目标观察者实现时需要注意的事项]
场景 在开发Cocoa程序时,由于界面是用Objective-C写的。无法使用C的目标观察者[1]类。如果是使用第二种方案2[2],那么也需要增加一个代理类。那么有没有更省事的办法? 说明 开发界面的时候,经常是需要在子界面里传递数据给主界面࿰…...
彩虹易支付最新版源码及安装教程(修复BUG+新增加订单投诉功能)
该源码当前版本为较新的版本,新增了订单投诉功能和一套精美的二次元模板。 此版本为全开源版本,所有文件均未加密。系统默认安装完成后无法直接打开,需要进一步配置。 本站特别针对BUG文件进行了修复,且在PHP7.4环境下表现良好。…...
ping香港服务器超时的原因通常有哪些?
Ping命令用于测试计算机与目标服务器之间的网络连接。当您在尝试使用ping命令检测服务器时遇到超时的情况,通常可能是由以下原因造成的: 1. 网络连接问题: - 本地网络故障:如网线损坏、路由器故障或配置不当。 - ISP(互联网服务提…...
书生大模型实战(从入门到进阶)L3-彩蛋岛-InternLM 1.8B 模型 Android 端侧部署实践
目录 1 环境准备 1.1 安装rust 1.2 安装Android Studio 1.3 设置环境变量 2 转换模型 2.1 安装mlc-llm 2.2 (可选)转换参数 2.3 (可选)生成配置 2.4 (可选)上传到huggingface 2.5 (可选) 测试转换的模型 3 打包运行 3.1 修改配置文件 3.2 运行打包命令 3.3 创建签…...
setState是同步更新还是异步更新
setState是同步更新还是异步更新 先说结论setState为什么设计为异步react18之前为什么不确定是同步还是异步呢react18之后setState有哪些改动 先说结论 React18之前:使用了ReactDOM.render,setState在React调度流程中是异步更新,在原生事件和…...
TCP 流量控制 - 滑动窗口和拥塞控制算法解析
滑动窗口主要管理数据流动的速率,对单个连接较好,拥塞控制则防止网络出现过载,对提高整体的网络通畅较好。下面详细解析两者的原理和作用。 1. TCP 滑动窗口算法 TCP 使用滑动窗口机制来控制数据的发送和接收,以实现流量控制&…...
MongoDB聚合操作及索引底层原理
目录 链接:https://note.youdao.com/ynoteshare/index.html?id=50fdb657a9b06950fa255a82555b44a6&type=note&_time=1727951783296 本节课的内容: 聚合操作: 聚合管道操作: 编辑 $match 进行文档筛选 编辑 将筛选和投影结合使用: 编辑 多条件匹配: …...
C++ | Leetcode C++题解之第454题四数相加II
题目: 题解: class Solution { public:int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {unordered_map<int, int> countAB;for (int u: A) {for (int v: B) {count…...
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
目录 stm32cubemx配置芯片选择工程配置stm32基础配置SPI的配置定时器的配置ADC的配置中断优先级的配置生成工程 工程代码编写FOC代码结构搭建电机编码器角度读取PWM产生FOC开环代码编写确定电机正负旋转方向电机旋转速度计算多圈逻辑角度电流采样极对数转子角度确定 闭环控制控…...
谷歌收录查询工具,谷歌收录查询工具的使用指南
谷歌收录查询工具是网站管理员和SEO专业人士用于检查网站是否被谷歌搜索引擎收录及其收录情况的重要辅助手段。以下是一些常用的谷歌收录查询工具及其详细使用指南: 一、Google Search Console(谷歌搜索控制台) 简介: Google Sea…...
vue3 拖拽插件(drag)
前端vue项目中,经常会有弹框拖拽的需求,下面介绍常用方法: 1.如果你使用的是elementPlus插件的el-dialog组件,只需要增加draggable属性即可,代码如下: <el-dialogv-model"showDiloag"width"500&quo…...
数据结构--线性表(顺序结构)
1.线性表的定义和基本操作 1.1线性表以及基本逻辑 1.1.1线性表 (1)n(>0)个数据元素的有限序列,记作(a1,a2,...an),其中ai是线性表中的数据元素,n是表的长度。 (2)…...
面试准备111
Java基础 反射 集合 多线程 Synchronized/volatile 线程池 cas atomic 网络 tcp 三次握手/四次挥手 流量控制 拥塞控制 数据结构 算法 Spring 循环依赖 Mybatis 如何防止sql注入 Mysql 索引 索引分类 索引设计原则 事务 四种隔离级别 MVCC 日志 Binlog…...
Spring 的 IOC 和 AOP 是什么,有哪些优点?解密 Spring两大核心概念:IOC与AOP的魅力所在
在现代Java开发中,Spring框架几乎是不可或缺的存在。它不仅简化了开发过程,还提高了软件的灵活性和可维护性。今天,我们要深入探讨Spring中的两个核心概念:IOC(控制反转)和AOP(面向切面编程&…...
OpenClaw自动化测试方案:Qwen2.5-VL-7B实现UI截图比对与报告生成
OpenClaw自动化测试方案:Qwen2.5-VL-7B实现UI截图比对与报告生成 1. 为什么需要自动化UI测试 作为一名长期奋战在一线的开发者,我深知UI测试的痛点所在。每次产品迭代后,手动检查各个页面的样式和布局是否正常,不仅耗时耗力&…...
示波器 | 光收发模块眼图测试
前言数字通信与光网络技术高速发展,光收发模块作为光电信号转换的核心器件,已成为数据中心、5G 通信、光纤传输等领域的关键基础组件,其信号质量、传输稳定性与可靠性影响着整个通信系统的运行效率与安全。眼图与误码率作为评估光模块性能的重…...
Qwen2.5-7B-Instruct作品分享:法律条款比对、合同风险点识别结果
Qwen2.5-7B-Instruct作品分享:法律条款比对、合同风险点识别结果 1. 项目背景与模型能力 Qwen2.5-7B-Instruct是阿里通义千问推出的旗舰版大模型,相比轻量级的1.5B/3B版本,7B参数规模带来了质的飞跃。在专业文本处理领域,特别是…...
LittleLink安全配置:保护你的个人链接页面免受恶意攻击
LittleLink安全配置:保护你的个人链接页面免受恶意攻击 【免费下载链接】littlelink A lightweight DIY Linktree alternative. 项目地址: https://gitcode.com/gh_mirrors/li/littlelink LittleLink作为一款轻量级DIY Linktree替代方案,让用户能…...
Agent 记忆终于有救了!5 款开源框架横评,附落地架构选型指南
做 AI Agent 的朋友,你有没有遇到过这个让人崩溃的场景—— 用户昨天告诉 Agent:“我是素食主义者,别给我推荐含肉的食谱。” 今天 Agent 回来了,热情洋溢地推荐了:红烧肉。 用户已经把你拉黑了。这就是没有记忆的 Age…...
1985-2025年全国省/市/区县土地利用分类面积及占比统计数据
数据介绍 全国土地利用分类面积统计数据(1985-2025) 数据简介 本数据集基于1985-2025年30米分辨率土地利用分类数据,结合行政区划边界,提供全国省、市、县三级行政单元的土地利用分类面积及占比统计,为土地利用变化…...
reids-cluster部署
准备六台主机,地址如下: 10.0.0.101 10.0.0.102 10.0.0.103 10.0.0.104 10.0.0.105 10.0.0.106 一、每台节点配置 Redis (101~106)修改 redis.conf,添加或修改以下参数:vim /etc/redis/redis.conf # 1. 允许所有网络接口 bind …...
通义千问1.5-1.8B-Chat商业应用:企业智能助手快速落地方案
通义千问1.5-1.8B-Chat商业应用:企业智能助手快速落地方案 1. 企业智能助手市场现状与需求 当前企业运营面临人力成本上升、服务标准化不足、数据分析需求激增等挑战。传统解决方案往往需要投入大量资源进行定制开发,而基于大模型的智能助手提供了快速…...
散点图进阶玩法:用颜色+大小+形状同时展示5个维度数据
散点图进阶玩法:用颜色大小形状同时展示5个维度数据 当我们需要在单一图表中呈现复杂的数据关系时,传统的二维散点图往往显得力不从心。本文将带你探索如何通过颜色映射、气泡大小调整和形状区分等技巧,在散点图中同时展示多达五个维度的数据…...
JetBrains GoLand 2026.1 (macOS, Linux, Windows) - 为 Go 开发者打造的完整 IDE
JetBrains GoLand 2026.1 (macOS, Linux, Windows) - 为 Go 开发者打造的完整 IDE JetBrains 跨平台开发者工具 请访问原文链接:https://sysin.org/blog/jetbrains-goland/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Jet…...
