套接字+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.pswp.cn/news/904196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904196.shtml
英文地址,請注明出處:http://en.pswp.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一…