目录
前言
我们知道想要进行网络通信,进行网络连接,首先我们需要找到对应设备,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#提供了多种方法来实现异步编程,其中最常见的是使用async
和await
关键字。
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
的方法内部使用。
异步编程的好处
非阻塞:异步方法不会阻塞调用线程,允许应用程序在等待操作完成时继续处理其他任务。
资源利用:通过更有效地利用系统资源,可以提高应用程序的响应性和性能。
简化代码:async
和await
关键字使异步代码看起来和同步代码非常相似,从而简化了异步编程的复杂性。
注意事项
异常处理:异步方法中的异常需要在调用方法中使用try-catch
块捕获。
死锁:在异步方法中,如果错误地使用await
(例如在UI线程上等待UI操作完成),可能会导致死锁。
性能考虑:虽然异步编程可以提高响应性,但过多的异步操作也可能导致性能问题。因此,应合理设计异步代码,避免不必要的异步调用。
标签:网络通信,异步,Unity,System,域名,part2,IP地址,using,IPAddress From: https://blog.csdn.net/weixin_67674686/article/details/143450471