首页 > 其他分享 >Unity网络通信(part2.通信必备知识)

Unity网络通信(part2.通信必备知识)

时间:2024-11-05 09:17:31浏览次数:3  
标签:网络通信 异步 Unity System 域名 part2 IP地址 using IPAddress

目录

前言

IPAddress类

IPEndPoint类

域名解析

IPHostEntry类

Dns类

异步方法

异步编程的好处

注意事项


前言

        我们知道想要进行网络通信,进行网络连接,首先我们需要找到对应设备,IP和端口号是定位网络中设备必不可少的关键元素。C#中提供了对应的IP和端口相关的类 来声明对应信息,对于之后的网络通信是必不可少的内容。


IPAddress类

using System.Net;
using UnityEngine;

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //命名空间:System.Net;
        //类名:IPAddress

        //初始化IP信息的方式

        //1.用byte数组进行初始化
        byte[] ipAddress = new byte[] { 118, 102, 111, 11 };
        IPAddress ip1 = new IPAddress(ipAddress);

        //2.用long长整型进行初始化
        //4字节对应的长整型 一般不建议大家使用
        IPAddress ip2 = new IPAddress(0x76666F0B);//0x76666F0B为118, 102, 111, 11的十六进制

        //3.推荐使用的方式 使用字符串转换
        IPAddress ip3 = IPAddress.Parse("118.102.111.11");

        //特殊IP地址
        //127.0.0.1代表本机地址

        //一些静态成员
        //获取可用的IPv6地址
        //IPAddress.IPv6Any
    }
}

IPEndPoint类

using System.Net;
using UnityEngine;

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //命名空间:System.Net;
        //类名:IPEndPoint
        //IPEndPoint类将网络端点表示为IP地址和端口号,表现为IP地址和端口号的组合

        //初始化方式
        IPEndPoint ipPoint = new IPEndPoint(0x79666F0B, 8080);

        IPEndPoint ipPoint2 = new IPEndPoint(IPAddress.Parse("118.102.111.11"), 8080);
    }
}

域名解析

域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等
说得简单点就是将好记的域名解析成IP
IP地址是网络上标识站点的数字地址,但是IP地址相对来说记忆困难
所以为了方便记忆,采用域名来代替IP地址标识站点地址。

比如:我们要登录一个网页 www.baidu.com 这个就是域名 我们可以通过记忆域名来记忆一个远端服务器的地址,而不是记录一个复杂的IP地址

域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成
我们在进行通信时有时会有需求通过域名获取IP

域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务
它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网
是因特网上解决网上机器命名的一种系统,因为IP地址记忆不方便,就采用了域名系统来管理名字和IP的对应关系

IPHostEntry类

命名空间:System.Net
类名:IPHostEntry
主要作用:域名解析后的返回值 可以通过该对象获取IP地址、主机名等等信息

该类不会自己声明,都是作为某些方法的返回值返回信息,我们主要通过该类对象获取返回的信息

获取关联IP                     成员变量:AddressList
获取主机别名列表          成员变量:Aliases
获取DNS名称                 成员变量:HostName

Dns类

命名空间:System.Net
类名:Dns
主要作用:Dns是一个静态类,提供了很多静态方法,可以使用它来根据域名获取IP地址

using System.Net;
using System.Threading.Tasks;
using UnityEngine;

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //常用方法
        //1.获取本地系统的主机名
        print(Dns.GetHostName());

        //2.获取指定域名的IP信息
        //根据域名获取
        //同步获取
        //注意:由于获取远程主机信息是需要进行网路通信,所以可能会阻塞主线程
        //IPHostEntry entry = Dns.GetHostEntry("www.baidu.com");
        //for (int i = 0; i < entry.AddressList.Length; i++)
        //{
        //    print("IP地址:" + entry.AddressList[i]);
        //}
        //for (int i = 0; i < entry.Aliases.Length; i++)
        //{
        //    print("主机别名" + entry.Aliases[i]);
        //}
        //print("DNS服务器名称" + entry.HostName);


        //异步获取
        GetHostEntry();
    }

    private async void GetHostEntry()
    {
        Task<IPHostEntry> task = Dns.GetHostEntryAsync("www.baidu.com");
        await task;
        for (int i = 0; i < task.Result.AddressList.Length; i++)
        {
            print("IP地址:" + task.Result.AddressList[i]);
        }
        for (int i = 0; i < task.Result.Aliases.Length; i++)
        {
            print("主机别名" + task.Result.Aliases[i]);
        }
        print("DNS服务器名称" + task.Result.HostName);
    }

        如果你不知道对方的IP地址,想通过域名和对方进行通信,可以通过Dns类通过域名得到IP地址后再和对方建立连接并通信。

异步方法

        在C#中,异步编程是一种用于处理长时间运行的操作(如I/O操作、网络请求或大量计算)的技术,以避免阻塞主线程,从而提高应用程序的响应性和性能。C#提供了多种方法来实现异步编程,其中最常见的是使用asyncawait关键字。

using System;  
using System.Net.Http;  
using System.Threading.Tasks;  
  
class Program  
{  
    static async Task Main(string[] args)  
    {  
        string url = "https://jsonplaceholder.typicode.com/posts/1";  
        string content = await FetchDataAsync(url);  
        Console.WriteLine(content);  
    }  
  
    //使用async关键字标记为异步方法。
    //返回一个Task<string>,表示该方法在异步操作完成后返回一个字符串。
    static async Task<string> FetchDataAsync(string url)  
    {  

        //使用HttpClient类进行网络请求,并使用await关键字等待请求完成。
        using (HttpClient client = new HttpClient())  
        {  
            HttpResponseMessage response = await client.GetAsync(url);  
            response.EnsureSuccessStatusCode();  
            string responseBody = await response.Content.ReadAsStringAsync();  
            return responseBody;  
        }  
    }  
}
  • async 关键字:用于标记一个方法为异步方法。异步方法允许在方法内部使用await关键字。
  • await 关键字:用于等待异步操作的完成,但不会阻塞调用线程。它只能在标记为async的方法内部使用。

异步编程的好处

非阻塞:异步方法不会阻塞调用线程,允许应用程序在等待操作完成时继续处理其他任务。

资源利用:通过更有效地利用系统资源,可以提高应用程序的响应性和性能。

简化代码asyncawait关键字使异步代码看起来和同步代码非常相似,从而简化了异步编程的复杂性。

注意事项

异常处理:异步方法中的异常需要在调用方法中使用try-catch块捕获。

死锁:在异步方法中,如果错误地使用await(例如在UI线程上等待UI操作完成),可能会导致死锁。

性能考虑:虽然异步编程可以提高响应性,但过多的异步操作也可能导致性能问题。因此,应合理设计异步代码,避免不必要的异步调用。

标签:网络通信,异步,Unity,System,域名,part2,IP地址,using,IPAddress
From: https://blog.csdn.net/weixin_67674686/article/details/143450471

相关文章

  • Unity网络开发基础(part4.数据通信模型)
    目录前言数据通信模型分散式集中式分布式C/S模型B/S模型P2P模型总结前言        在Unity网络开发中,数据通信模型是实现客户端与服务端之间数据交换的核心。不同的数据通信模型具有不同的特点和适用场景,选择合适的模型对于实现高效、稳定的数据通信至关重......
  • Unity网络开发基础(part5.网络协议)
    目录前言网络协议概述OSI模型OSI模型的规则第一部分物理层数据链路层网络层传输层第二部分​编辑应用层表示层会话层每层的职能TCP/IP协议TCP/IP协议的规则TCP/IP协议每层的职能TCP/IP协议中的重要协议TCP协议三次握手四次挥手UDP协议TCP与UDP对比总......
  • Unity图片旋转
    Unity图片旋转概述旋转图片的应用场景Unity中旋转图片技术广泛应用于各类游戏和互动体验中,为用户带来生动直观的视觉效果。主要应用场景包括:UI设计:旋转按钮、指示器等提升界面交互性动画制作:实现角色转身、物品旋转等动作物理模拟:模拟真实世界的旋转运动特......
  • blender动画导出Unity
    在Blender构建一个带有骨骼的模型为根骨骼(Root)构建动画导出FBX文件这里我是用了个插件,BetterFBXImport注意导出时,要将动画设置在第1帧,即小球在原点位置,不然导出后的FBX的原点会跑歪导入进Unity,设置一下根骨参数动画参数调整注意这3个选项是询问你,是否将旋转,X/Y/Z......
  • 【Unity魔法音效包】SPELLS MAGIC 1 SOUND FX PACK 施法、技能释放、法术命中
    SPELLSMAGIC1:SOUNDFXPACK是UnityAssetStore上的一个音效包,专为奇幻类游戏中的魔法和法术效果设计。该插件提供了丰富的魔法音效,适用于施法、技能释放、法术命中、环境音效等场景。该音效包旨在帮助开发者提升游戏中的法术表现力,使玩家在施展魔法时获得更强的沉浸感......
  • unity3d————坐标转换(世界转本地)
    this.transform.InverseTransformPoint1. 世界坐标系与局部坐标系世界坐标系:Unity3D中的全局参考框架,所有游戏对象的位置、旋转和缩放都是相对于这个框架来定义的。局部坐标系:每个游戏对象都有自己的局部坐标系,这个坐标系是相对于该游戏对象的位置、旋转和缩放来定义的。2......
  • unity3d——Time
    在Unity3D中,Time类是一个非常重要的工具类,它提供了一系列与时间相关的属性和方法,帮助开发者在游戏中实现各种时间相关的操作。以下是一些Time类常用的方法及其示例:一、常用属性Time.time含义:表示从游戏开始到现在的时间,以秒为单位。该时间会随着游戏的暂停而停止计算。示例......
  • unity3d——Vector3
    在Unity3D中,Vector3是一个非常重要的结构体,用于表示三维空间中的位置和方向。以下是关于Vector3的一些关键知识点:一、Vector3的基本概念和属性定义:Vector3是一个包含三个浮点数的结构体,分别代表X、Y和Z轴上的分量。它用于描述具有大小和方向两个属性的物理量,如速度、加速度......
  • Unity——删除一个DontDestroyOnLoad的物体
    文章目录前言一、示例前言在Unity中,如果你想要删除一个被标记为DontDestroyOnLoad的GameObject,你可以通过调用Destroy方法来实现。但是由于DontDestroyOnLoad会在场景切换时保持对象不被销毁,你需要先取消这个标记,然后再销毁它。一、示例usingUnityEngine;publ......
  • 3.多路复用网络通信
    1.NIO提供的多路复用的通信1.1传统的socket通信模型传统的socket通信的模型是服务器启用socket服务,然后通过accept()方法阻塞等待客户端的连接,对每一个客户端创建一个线程进行io的处理缺点:随着客户端数量的增加,如果要保持持续通信,那么就不能摧毁这些线程,而是需要一直保留(但......