制作加載中動畫:
創建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();}
該系列專欄為網課課程筆記,僅用于學習參考。???