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.rhkb.cn/news/437893.html

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

相关文章

09_OpenCV彩色图片直方图

import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inlineimg cv2.imread(computer.jpeg, 1) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.show()plot绘制直方图 plt.hist(img.ravel(), 256) #ravel() 二维降一维 256灰度级…

pycharm汉化插件无法使用也无法卸载的解决方法

pycharm汉化插件无法使用也无法卸载的解决方法 本文目录&#xff1a; 一、故障描述 二、故障解决 零、时光宝盒 学习没有可能一帆风顺&#xff0c;我们都是在不断遇到的各种突发问题&#xff0c;不断努力解决的过程中成长。 前几天&#xff0c;我发现家里的网络晚上12点左右开…

初识算法 · 双指针(3)

目录 前言&#xff1a; 和为s的两数之和 题目解析&#xff1a; ​编辑 算法原理&#xff1a; 算法编写&#xff1a; 三数之和 题目解析 算法原理 算法编写 前言&#xff1a; 本文通过介绍和为S的两数之和&#xff0c;以及三数之和&#xff0c;对双指针算法进行深一步…

欧科云链OKLink相约TOKEN2049:更全面、多元与安全

过去几日&#xff0c;OKLink 与全球 Web3 从业者与爱好者们相约狮城。在多场激动人心的活动上分享了我们的产品进展、有关于链上数据的专家观点以及打磨产品的经验。同时也听到了很多来自行业的宝贵声音。跟随我们的脚步&#xff0c;捕捉这充实一周的精彩瞬间&#xff1a; 1、…

netty之基础aio,bio,nio

前言 在Java中&#xff0c;提供了一些关于使用IO的API&#xff0c;可以供开发者来读写外部数据和文件&#xff0c;我们称这些API为Java IO。IO是Java中比较重要知识点&#xff0c;且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能&#xff0c;目前有三种IO共…

5G NR SSB简介

文章目录 SSB介绍SSB波束扫描 SSB介绍 5G NR 引入了SSB 这个概念&#xff0c;同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB) 它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH…

【分页】Spring Boot 列表分页 + javaScript前台展示

后端&#xff1a; 准备好查询实体与分页实体 1、分页工具实体 package com.ruoyi.dms.config;import com.alibaba.nacos.api.model.v2.Result; import lombok.Data;import java.io.Serializable; import java.util.List;/*** author 宁兴星* description: 列表返回结果集*/ …

【10】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-泛型基础全解(泛型函数、泛型接口、泛型类)及参数、接口补充

序言&#xff1a; 本文详细讲解了关于ArkTs语言中的泛型&#xff0c;其中包含泛型函数、泛型接口、泛型约束、泛型类及其中参数的使用方法&#xff0c;补充了一部分接口相关的知识&#xff0c;包括接口的继承和具体实现&#xff0c;也写到了一些边边角角的小知识&#xff0c;剩…

详细介绍:API 和 SPI 的区别

文章目录 Java SPI (Service Provider Interface) 和 API (Application Programming Interface) 的区别详解目录1. 定义和目的1.1 API (Application Programming Interface)1.2 SPI (Service Provider Interface) 2. 使用场景2.1 API 的应用场景2.2 SPI 的应用场景 3. 加载和调…

jmeter学习(1)线程组与发送请求

1、线程组 执行顺序 &#xff1a;setUp线程组 > 线程组 > tearDown线程组 2、 发送请求 可以发送http、java、dubbo 请求等 下面讲解发送http 1&#xff09;Http请求默认值 作用范围是该线程组下的所有HTTP请求&#xff0c;如果http请求设置的与默认值冲突&#xff0…

PC端微信小程序如何调试?

向往常一样运行开微信小程序开发者工具 如果只弹出pc端小程序&#xff0c;没有出现调试的界面&#xff1a;点击胶囊按钮的三个…选择重新进入小程序 即可依次展开相应的功能调试&#xff0c;改完代码没反应再刷新看看&#xff0c;再没反应就再次重新点击编译并自动调试。

【学习笔记】手写 Tomcat 六

目录 一、线程池 1. 构建线程池的类 2. 创建任务 3. 执行任务 测试 二、URL编码 解决方案 测试 三、如何接收客户端发送的全部信息 解决方案 测试 四、作业 1. 了解工厂模式 2. 了解反射技术 一、线程池 昨天使用了数据库连接池&#xff0c;我们了解了连接池的优…

DSPy101

DSPy 介绍 DSPy&#xff08;Declarative Self-improved Language Programs in Python&#xff09; 是一个用于系统化和增强在流水线内使用语言模型的框架&#xff0c;它通过数据驱动和意图驱动的系统来优化大型语言模型&#xff08;LLM&#xff09;的使用。 DSPy 的核心是模块…

C语言的内存结构

在电脑中C语言编译器也像其他软件一样占用一块内存空间。 为了更好的利用好这块内存&#xff0c;C语言将他们分为 在C语言中&#xff0c;变量定义的位置不一样&#xff0c;那么在内存中所处的位置也是不一样的。&#xff08;变量在函数内部是存储在栈里&#xff0c;而在函数外部…

闯关训练三:Git 基础知识

任务1: 破冰活动&#xff1a;自我介绍 点击Fork目标项目&#xff0c;创建一个新的Fork 获取仓库链接 在连接好开发机的vscode终端中逐行执行以下代码&#xff1a; git clone https://github.com/KelvinIII/Tutorial.git # 修改为自己frok的仓库 cd Tutorial/ git branch -a g…

Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进

作者&#xff1a;席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑&#xff0c;从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助&#xff01; Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称&#xff0c;定位于一个更易于构建云原…

Android SystemUI组件(11)SystemUIVisibility解读

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节思维导图&#xff0c;主要关注左侧最上方SystemUiVisibility解读部分即可。 本章节主要讲解SystemUiVisibility的概念及其相…

LeetCode从入门到超凡(四)深入浅出理解贪心算法

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的LeetCode学习总结文档&#xff1b;本文主要讲解贪心算法。&#x1f495;&#x1f495;&#x1f60a; 介绍 贪心算法是一种经典的算法…

《中国电子报》报道: 安宝特AR为产线作业者的“秘密武器

近日&#xff0c;中国电子报在其文章《下一代工业智能终端重新定义制造业》中对安宝特的增强现实&#xff08;AR&#xff09;解决方案给予了高度评价&#xff0c;称其为产线作业者的“秘密武器”。这一创新技术改变了传统制造业的作业方式&#xff0c;使得操作人员能够在生产过…

Java中Map和Set详细介绍,哈希桶的实现

大家好呀&#xff0c;前一节我们接触了二叉搜索树&#xff0c;那么紧接着&#xff0c;我们要学习一种十分重要而且也是我们在初阶数据结构中接触的最后一种数据结构—Map和Set&#xff0c;本篇博客将会详细介绍两种数据结构&#xff0c;并且针对哈希表底层实现一个哈希桶&#…