套接字+Socket连接

制作加载中动画:

创建Panel,制作预制体,在Image游戏物体中添加DOTween插件,相关设置如下:

(此为DOTween Pro,需付费,也可按下面的数值编写代码解决)

Socket套接字

       套接字就是将IP地址与主机端口号合并在一起后的数据,IP地址定位主机位置,端口号知道

        通讯入口与出口,从而就可以实现主机的数据交换。

        IP协议实现主机的网络定位

        操作系统的端口实现数据的流入与流出

        Socket编程基于传输层实现,所以需要指定协议类型(TCP或UDP)

TCP编程方法(C#)

        字节长度关系

                日常说的G,M,指的是数据容量

                        UTF-8编码是几个字节存储?

                                长度是从1个字节~6个字节存储,其中中文是3个字节

                        长度计量单位

                                B:一个字节(Byte)

                                KB:1024个B

                                MB:1024个KB

                                GB:1024个MB

                                TB:1024个GB

                                PB:1024个TB

                

        手册:https://msdn.microsoft.com/zh-cn/

        连接(三次握手)

                同步连接       

                          //创建套接字

                                Socket socket = new Socket(

                                        AddressFamily.InterNetwork,
                                          SocketType.Stream,
                                          ProtocolType.Tcp

                                );

                                //调用连接方法

                                socket.Connect("IP地址",端口号);

                异步连接

                        //创建套接字

                        _TcpConnection = new Socket(AddressFamily.InterNetwork,
                                          SocketType.Stream,
                                          ProtocolType.Tcp);
                        _TcpConnection.BeginConnect(Host, Port, _EndConnect, null);

                        //_EndConnect回调函数中执行

                         _TcpConnection.EndConnect(ar); //ar异步连接结果

        断开(四次挥手) 

                        同步断开

                                //下次使用,会创建全新的套接字

                                _Socket.Disconnect(false);

                                //关闭套接字连接,释放资源

                                _Socket.Close();

                        异步断开

                                socket.BeginDisconnect(false,_EndDisconnect,null);

                                //EndDisconnect回调函数执行

                                socket.EndDisconnect(异步断开连接结果);

                                socket.Close();

        监听绑定(服务器开发)

                Bind()函数实现

        接收  

        发送

Unity测试连接相关代码:

using System;
using System.Net.Sockets;
using UnityEngine;
using UnityEngine.Events;namespace HonorZhao
{public class TcpDriver : MonoBehaviour{#region Singletonprivate static readonly object _lock = new object();private static TcpDriver _Instance;public static TcpDriver One(){lock (_lock){if (_Instance == null){GameObject driver = new GameObject("TcpDriver");_Instance = driver.AddComponent<TcpDriver>();DontDestroyOnLoad(driver);}return _Instance;}}private void Awake(){if (_Instance != null && _Instance != this){Destroy(gameObject);}}#endregionpublic TCP_CONNECT_STATUS _ConnectStatus = TCP_CONNECT_STATUS.Default;public string Host = "";public int Port = 0;public UnityAction ConnectedAction;public UnityAction DisconnectedAction;private Socket _TcpConnection;public void BeginConnect(){if (_ConnectStatus != TCP_CONNECT_STATUS.Default) return;try{_TcpConnection = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);_TcpConnection.BeginConnect(Host, Port, _EndConnect, null);_ConnectStatus = TCP_CONNECT_STATUS.BeginConnect;}catch (Exception ex){Debug.LogError($"[TCP] 连接初始化失败: {ex.Message}");_ConnectStatus = TCP_CONNECT_STATUS.Failed;DisconnectedAction?.Invoke();}}private void _EndConnect(IAsyncResult ar){try{_TcpConnection.EndConnect(ar);if (_TcpConnection.Connected){_ConnectStatus = TCP_CONNECT_STATUS.Connected;ConnectedAction?.Invoke();}}catch (Exception ex){Debug.LogError($"[TCP] 连接失败: {ex.Message}");_ConnectStatus = TCP_CONNECT_STATUS.Failed;DisconnectedAction?.Invoke();}}public void BeginDisconnect(){if (_TcpConnection == null) return;try{if (_TcpConnection.Connected){_TcpConnection.Shutdown(SocketShutdown.Both);}}finally{_TcpConnection?.Close();_TcpConnection = null;_ConnectStatus = TCP_CONNECT_STATUS.Default;DisconnectedAction?.Invoke();}}private void OnDestroy(){BeginDisconnect();}}
}
public enum TCP_CONNECT_STATUS
{Default,BeginConnect,Connected,Failed
}
using HonorZhao;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;public class TestConnect : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){TestConnection();}// 测试用例void TestConnection(){TcpDriver.One().Host = "echo.websocket.org";TcpDriver.One().Port = 7;TcpDriver.One().ConnectedAction += () => Debug.Log("Connected!");TcpDriver.One().DisconnectedAction += () => Debug.Log("Disconnected!");TcpDriver.One().BeginConnect();// 5秒后断开测试Invoke(nameof(DisconnectTest), 5f);}void DisconnectTest() => TcpDriver.One().BeginDisconnect();}

该系列专栏为网课课程笔记,仅用于学习参考。   

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

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

相关文章

第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题答和案解析

一、选择题 第 1 题 单选题 题目:表达式 ‘6’ - ‘1’ 的值是 ( ) A. 整数 5 B. 字符 5 C. 表达式不合法 D. 字符 6 答案:A 解析:在 C++ 中,字符常量以 ASCII 码形式存储。6 的 ASCII 码为 54,1 的 ASCII 码为 49,二者相减结果为 5,是整数类型,因此选 A。 第 2 题 …

使用Rust + WebAssembly提升前端渲染性能:从原理到落地

一、问题背景&#xff1a;为什么选择WebAssembly&#xff1f; 最近在开发数据可视化大屏项目时&#xff0c;我们遇到了一个棘手的问题&#xff1a;前端需要实时渲染10万数据点的动态散点图&#xff0c;使用纯JavaScript Canvas方案在低端设备上帧率不足15FPS。经过性能分析&a…

【沐风老师】3DMAX按元素UV修改器插件教程

3DMAX按元素UV修改器UV By Element是一个脚本化的修改器插件。对于需要创建随机化纹理效果的用户而言&#xff0c;3DMAX的UV By Element修改器无疑是一款高效工具&#xff0c;它将以伪随机量偏移、旋转和/或缩放每个元素的UV坐标。 【版本要求】 3dMax 2016及以上 【安装方法】…

【神经网络与深度学习】改变随机种子可以提升模型性能?

引言 随机种子在机器学习和数据处理领域中至关重要&#xff0c;它决定了模型训练、数据划分以及参数初始化的随机性。虽然固定随机种子能确保实验的可重复性&#xff0c;但改变随机种子有时会意外提升模型性能。本文将探讨这一现象的潜在原因&#xff0c;并揭示随机性如何影响…

java技术总监简历模板

模板信息 简历范文名称&#xff1a;java技术总监简历模板&#xff0c;所属行业&#xff1a;其他 | 职位&#xff0c;模板编号&#xff1a;XDNUTA 专业的个人简历模板&#xff0c;逻辑清晰&#xff0c;排版简洁美观&#xff0c;让你的个人简历显得更专业&#xff0c;找到好工作…

OpenLayers:侦听缩放级别的变化

在实际开发中我们常常需要根据不同的缩放级别设置不同的展示效果或者执行不同的操作&#xff0c;因此侦听缩放级别的变化就很重要。想要侦听变化就需要依赖于OpenLayers中的事件系统&#xff0c;下面我将介绍两个相关的事件。 一、地图事件 moveend 1.介绍 在地图的移动结束…

Langchain4j基于ElasticSearch的向量数据库配置后,启动报错

报错信息: co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/search] failed: [search_phase_execution_exception] all shards failedat co.elastic.clients.transport.ElasticsearchTransportBase.getApiResponse(ElasticsearchTransportBase.java:34…

如何解决 403 错误:请求被拒绝,无法连接到服务器

解决 403 错误&#xff1a;请求被拒绝&#xff0c;无法连接到服务器 当您在浏览网站或应用时&#xff0c;遇到 403 错误&#xff0c;通常会显示类似的消息&#xff1a; The request could not be satisfied. Request blocked. We can’t connect to the server for this app o…

PyTorch 2.0编译模式深度评测:图优化对GPU利用率的影响

一、编译革命的性能拐点 PyTorch 2.0的torch.compile通过TorchDynamo与XLA两种编译模式&#xff0c;将动态图执行效率推向新高度。本文基于NVIDIA A100与Google TPUv4硬件平台&#xff0c;通过ResNet-50、Transformer-XL等典型模型&#xff0c;揭示不同编译策略对GPU资源利用率…

在CentOS环境中安装MySQL数据库保姆级教程

一.确认当前系统版本 1.1登录系统&#xff0c;切换至root账户 如图所示&#xff1a; 1.2&#xff1a;在终端中执行如下命令查看系统版本 cat /etc/redhat-release 二.添加 MySQL Yum 源 2.1访问MySQL开发者专区 https://dev.mysql.com/downloads/repo/yum/ TIPS: 1.发布包命…

SpringBoot智能排课系统源码开发与实现

概述 基于SpringBoot框架开发的智能排课系统。该系统是一款功能完善的校园管理系统&#xff0c;包含管理员、教师和学生三种角色权限&#xff0c;实现了课程管理、排课算法、成绩录入等核心功能&#xff0c;是学习SpringBoot开发和企业级项目实践的优质资源。 主要内容 1. 管…

探秘 RocketMQ 的 DLedgerServer:MemberState 的技术解析与深度剖析

在 RocketMQ 构建高可靠、强一致性消息系统的架构中&#xff0c;DLedgerServer 扮演着举足轻重的角色&#xff0c;而 MemberState 作为 DLedgerServer 内部用于描述节点状态的核心类&#xff0c;更是整个分布式日志模块稳定运行的关键。深入理解 MemberState 的设计理念、功能特…

字符串匹配 之 KMP算法

文章目录 习题28.找出字符串中第一个匹配项的下标1392.最长快乐前缀 本博客充分参考灵神和知乎的另一位博主 灵神KMP算法模版 知乎博主通俗易懂讲解 对于给定一个主串S和一个模式串P,如果让你求解出模式串P在主串S中匹配的情况下的所有的开始下标简单的做法又称为Brute-Force算…

Nginx相关知识

目录 一.HTTP请求数据在服务器中的传输与处理详解 1.2 套字节 1.3 零拷贝技术 二.I/O模型 2.1 I/O模型简介 2.2 常见的I/O模型及其特点 1.同步/异步 2.阻塞vs 非阻塞 3. 同步/异步与阻塞/非阻塞的关系 4.多路复用I/O模型 5.异步I/O模型 三.Nginx模块 3.1 概述ng…

分布式数字身份:迈向Web3.0世界的通行证 | 北京行活动预告

数字经济浪潮奔涌向前&#xff0c;Web3.0发展方兴未艾&#xff0c;分布式数字身份&#xff08;Decentralized Identity&#xff0c;简称DID&#xff09;通过将分布式账本技术与身份治理相融合&#xff0c;在Web3.0时代多方协作的分布式应用场景中发挥核心作用&#xff0c;是构建…

ES6入门---第三单元 模块四:Set和WeakSet

set数据结构: 类似数组&#xff0c;但是里面不能有重复值&#xff0c;如果有&#xff0c;只显示一个 set用法: let setArr new Set([a,b]); setArr.add(a); 往setArr里面添加一项 let setArr new Set().add(a).add(b).add(c); setArr.delete(b); 删除一项 setArr.ha…

Cognito

首先Cognito没有提供登录至AWS控制台的功能&#xff0c;然而您可以通过Cognito Identity Pool获取到IAM role的credentials [1]&#xff0c;再另外通过代码自行将IAM role credentials拼凑成AWS控制台登录的URL [2]。 最后&#xff0c;由于Cognito的使用除了User Pool以及Iden…

EfficientNet 改进:与Transformer结合的图像分类模型

1.介绍 在计算机视觉领域,EfficientNet因其高效的网络架构设计而广受欢迎。 本文将深入分析一个结合EfficientNet主干和Transformer分类头的创新模型实现。 模型概述 这个实现将EfficientNet的高效特征提取能力与Transformer的强大序列建模能力相结合,主要包含以下几个核心…

复杂网络系列:第 5 部分 — 社区检测和子图

关键词&#xff1a;Community Detection Algorithms 一、说明 在本教程中&#xff0c;我们将探讨网络分析的两个基本方面&#xff1a;社区检测和使用子图。了解这些概念将使您能够发现复杂网络中隐藏的结构和关系。 二、何为社区&#xff0c;何为社区检测&#xff1f; 2.1 …

【办公类-99-04】20250504闵豆统计表excle转PDF,合并PDF、添加中文字体页眉+边框下划线

需求说明 督导检查&#xff0c;各条线都要收集资料。 今天去加班&#xff0c;遇到家教主任&#xff0c;她让我用保教主任的彩色打印机打印这套活跃度表格。&#xff08;2023学年上学期下学期-2024学年上学期&#xff0c;就是202309-202504&#xff09; 每个excle都是内容在A4一…