当前位置: 首页 > ai >正文

套接字+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.xdnf.cn/news/3733.html

相关文章:

  • Y1模拟一 补题报告
  • function包装器的意义
  • Milvus(13):自定义分析器、过滤器
  • Dubbo(94)如何在金融系统中应用Dubbo?
  • validator - Go 结构体验证库
  • 每天五分钟深度学习框架PyTorch:基于Dataset封装自定义数据集
  • 深入理解Java垃圾回收机制
  • NV228NV254固态美光颗粒NV255NV263
  • 2025年01月03日美蜥(杭州普瑞兼职)一面
  • 【C++ Qt】输入类控件(上) LineEdit、QTextEdit
  • 升级 CUDA Toolkit 12.9 与 cuDNN 9.9.0 后验证指南:功能与虚拟环境检测
  • 黑马点评day01(基于Redis)
  • C++学习:六个月从基础到就业——C++11/14:右值引用与移动语义
  • Webug4.0靶场通关笔记14- 第18关 文件上传之Nginx解析缺陷
  • Linux线程深度解析:从基础到实践
  • 码蹄集——偶数位、四边形坐标
  • 南京优质的公司有哪些?
  • 小程序 IView WeappUI组件库(简单增删改查)
  • 变更需求代价:影响分析
  • Java面试大纲(以及常见面试问答)
  • 19、权限控制:分院帽系统——React 19 RBAC实现
  • iview自定义下拉树菜单
  • 【C++】 —— 笔试刷题day_25
  • C++多态(下)
  • 【办公类-99-04】20250504闵豆统计表excle转PDF,合并PDF、添加中文字体页眉+边框下划线
  • 观察者模式(Observer Pattern)详解
  • 计算机系统结构 第二章 :缓存优化
  • vector的两种实现
  • Java并发编程-多线程基础(二)
  • 【信息系统项目管理师】【历年真题】论文中需要会画的图/表格