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);}}
}

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

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

相关文章

项目-坦克大战学习-爆炸特效消除

对于爆炸特效的消除有个非常简单的想法&#xff0c;给爆炸类设置一个bool检测是否爆炸完成&#xff0c;初始为false在爆炸特效4图片索引处检测&#xff0c;如果索引为4&#xff08;所有图片播放完成&#xff09;那么将bool改为true public bool isboomfalse; if(index4) { …

C++(string类的实现)

1. 迭代器、返回capacity、返回size、判空、c_str、重载[]和clear的实现 string类的迭代器的功能就类似于一个指针&#xff0c;所以我们可以直接使用一个指针来实现迭代器&#xff0c;但如下图可见迭代器有两个&#xff0c;一个是指向的内容可以被修改&#xff0c;另一个则是指…

Swagger配置且添加小锁(asp.net)(笔记)

此博客是基于 asp.net core web api(.net core3.1)框架进行操作的。 一、安装Swagger包 在 NuGet程序包管理中安装下面的两个包&#xff1a; swagger包&#xff1a;Swashbuckle.AspNetCore swagger包过滤器&#xff1a;Swashbuckle.AspNetCore.Filters 二、swagger注册 在…

php与python建站的区别有哪些

php与Python建站的区别&#xff1a; 1、语言层面Python的特性比php好&#xff0c;更加规范。 2、Python的性能比php高。 3、有只需要启动服务的时候执行一次的代码&#xff0c;在php里每个请求都会被执行一次&#xff0c;Python不需要。虽然php可以通过缓存缩短这方面的差距…

Java题集(从入门到精通)04

此系列文章收录大量Java经典代码题&#xff08;也可以算是leetcode刷题指南&#xff09;&#xff0c;希望可以与大家一起努力学好Java。3、2、1&#xff0c;请看&#xff01; 目录 一、北京地铁计价程序 二、人名币兑换 三、各位数字之和 一、北京地铁计价程序 【问题描述…

【接口测试】任务1:登录接口

需要技能竞赛软件测试资料的同学们可s聊我&#xff0c;详细了解 任务实现要求 根据系统管理员—登录—接口API文档&#xff0c;编写接口测试用例&#xff0c;分别使用PostMan及JMeter进行接口测试&#xff0c;需要检查系统接口是否能正常工作&#xff0c;返回值是否正确&#…

RCE+[伪协议综合]

<aside> &#x1f4a1; 伪协议种类 </aside> **1 file:// — 访问本地文件系统 2 http:// — 访问 HTTP(s) 网址 3 ftp:// — 访问 FTP(s) URLs 4 php:// — 访问各个输入/输出流&#xff08;I/O streams&#xff09; 5 zlib:// — 压缩流 6 data:// — 数据&am…

使用CSS实现酷炫加载

使用CSS实现酷炫加载 效果展示 整体页面布局 <div class"container"></div>使用JavaScript添加loading加载动画的元素 document.addEventListener("DOMContentLoaded", () > {let container document.querySelector(".container&q…

初始爬虫11

1.斗鱼selenium爬取 # -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By import timeclass Douyu(object):def __init__(self):self.url https://www.douyu.com/directory/allself.driver webdriver.Chrome()self.driver…

超分辨率重构论文集合

《Detection of Tea Leaf Blight in Low-Resolution UAV Remote Sensing Images》 发表信息&#xff1a;发表于《IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSING》2024 年&#xff0c;作者 Gensheng Hu 等&#xff0c;来自安徽大学等。核心内容 背景&#xff1a;茶叶枯萎…

Scala 字符串

Scala 字符串 Scala 是一种多范式的编程语言&#xff0c;它结合了面向对象和函数式编程的特点。在 Scala 中&#xff0c;字符串是不可变的&#xff0c;这意味着一旦创建了一个字符串&#xff0c;就不能更改它。Scala 字符串由 Java 字符串支持&#xff0c;因此 Scala 字符串的…

在线css像素px到Em的转换器

具体请前往&#xff1a;在线Px转Em工具--将绝对像素(px)长度单位转换为相对长度em

热补丁反调试API Hook—上跳/下跳

以 IsDebuggerPresent 函数为例&#xff0c;可以看到可以上跳&#xff08;简单&#xff09;&#xff0c;也可以下跳&#xff08;复杂&#xff09;。 上跳&#xff1a; BYTE NewCodes[2] { 0xEB,0xF9 }; BYTE JmpCode[5] { 0xE9,0 }; BYTE oldCodes[2] { 0 };BOOL Mydebug() …

第三十八章 验证和解密入站消息 - 实例身份验证和 WS-Security

文章目录 第三十八章 验证和解密入站消息 - 实例身份验证和 WS-Security实例身份验证和 WS-Security检索安全标头元素FindByEncryptedKeySHA1()FindElement()FindLastElement() 检查签名确认 第三十八章 验证和解密入站消息 - 实例身份验证和 WS-Security 实例身份验证和 WS-S…

拿下奇怪的前端报错:某些多摄手机拉取部分摄像头视频流会导致应用崩溃,该如何改善呢?

现在有些手机更新的很激进&#xff0c;但是却没有很好的实现web规范&#xff0c;不支持facingMode配置来控制前后摄像头&#xff0c;只能根据序号切换&#xff0c;但拉取到某些设备的流会导致应用崩溃&#xff0c;这里就教一招如何尽可能的改善用户体验 至少不至于次次都崩溃&a…

普通人怎么才能实现时间自由和财富自由?

在快节奏的现代生活中&#xff0c;每个人都怀揣着对时间自由和财富自由的向往。尤其是对于普通人而言&#xff0c;这不仅仅是一种梦想&#xff0c;更是一种可以通过智慧和努力实现的生活方式。副业&#xff0c;作为主业之外的另一片天地&#xff0c;正逐渐成为实现这一梦想的重…

npx create-react-app react-basic 创建react 项目报错

npx create-react-app创建react 项目报错 npm error code ERESOLVE npm error ERESOLVE could not resolve npm error npm error While resolving: react-basic0.1.0 npm error Found: reactundefined npm error node_modules/react npm error react"*" from the …

63.5 注意力提示_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录注意力提示生物学中的注意力提示查询、键和值注意力的可视化使用 show_heatmaps 显示注意力权重代码示例 代码解析结果 小结练习 注意力提示 &#x1f3f7;sec_attention-cues 感谢读者对本书的关注&#xff0c;因为读者的注意力是一种稀缺…

Angular ng-state script 元素的生成机制介绍

ng-state 的生成过程是在 Angular SSR 中非常关键的部分。为了让客户端能够接管服务器渲染的页面状态&#xff0c;Angular 在服务器端需要将应用的当前状态保存下来&#xff0c;并将其嵌入到返回的 HTML 中。这样&#xff0c;客户端在接管时就可以直接使用这些状态&#xff0c;…