目录

Unity网络通信part4.Socket

Unity网络通信(part4.Socket)

目录


前言

https://i-blog.csdnimg.cn/direct/79a48f1a67bf461e974f2244a8f47905.png

在Unity网络通信的系列探讨中,我们已经了解了序列化和反序列化的基础知识和应用。接下来,我们将深入探讨Socket通信,这是Unity网络通信中的核心部分。


Socket套接字的作用

它是C#提供给我们用于网络通信的一个类(在其它语言当中也有对应的Socket类)

类名:Socket

命名空间:System.Net.Sockets

Socket套接字是支持TCP/IP网络通信的基本操作单位

一个套接字对象包含以下关键信息:

1.本机的IP地址和端口

2.对方主机的IP地址和端口

3.双方通信的协议信息

一个Sccket对象表示一个本地或者远程套接字信息

它可以被视为一个数据通道

这个通道连接与客户端和服务端之间

数据的发送和接受均通过这个通道进行

一般在制作长连接游戏时,我们会使用Socket套接字作为我们的通信方案

我们通过它连接客户端和服务端,通过它来收发消息

可以把它抽象的想象成一根管子,插在客户端和服务端应用程序上,通过这个管子来传递交换信息


Socket的类型

Socket套接字有3种不同的类型

1.流套接字

主要用于实现TCP通信,提供了面向连接、可靠的、有序的、数据无差错且无重复的数据传输服务

2.数据报套接字

主要用于实现UDP通信,提供了无连接的通信服务,数据包的长度不能大于32KB,不提供正确性检查,不保证顺序,可能出现重发、丢失等情况

3.原始套接字(不常用,不深入讲解)

主要用于实现IP数据包通信,用于直接访问协议的较低层,常用于侦听和分析数据包

通过Socket的构造函数 我们可以申明不同类型的套接字

Socket s = new Socket();

参数一

AddressFamily 网络寻址 枚举类型,决定寻址方案

常用:

1.InterNetwork  IPv4寻址

2.InterNetwork6 IPv6寻址

做了解:

1.UNIX          UNIX本地到主机地址

2.ImpLink       ARPANETIMP地址

3.Ipx           IPX或SPX地址

4.Iso           ISO协议的地址

5.Osi           OSI协议的地址

7.NetBios       NetBios地址

9.Atm           本机ATM服务地址

参数二

SocketType 套接字枚举类型,决定使用的套接字类型

常用:

1.Dgram         支持数据报,最大长度固定的无连接、不可靠的消息(主要用于UDP通信)

2.Stream        支持可靠、双向、基于连接的字节流(主要用于TCP通信)

做了解:

1.Raw           支持对基础传输协议的访问

2.Rdm           支持无连接、面向消息、以可靠方式发送的消息

3.Seqpacket     提供排序字节流的面向连接且可靠的双向传输

参数三

ProtocolType 协议类型枚举类型,决定套接字使用的通信协议

常用:

1.TCP           TCP传输控制协议

2.UDP           UDP用户数据报协议

做了解:

1.IP            IP网际协议

2.Icmp          Icmp网际消息控制协议

3.Igmp          Igmp网际组管理协议

4.Ggp           网关到网关协议

5.IPv4          Internet协议版本4

6.Pup           PARC通用数据包协议

7.Idp           Internet数据报协议

8.Raw           原始IP数据包协议

9.Ipx           Internet数据包交换协议

10.Spx          顺序包交换协议

11.IcmpV6       用于IPv6的Internet控制消息协议

参数的常用搭配:

SocketType.Dgram + ProtocolType.Udp = UDP协议通信(常用,主要学习)

SocketType.Stream + ProtocolType.Tcp = TCP协议通信(常用,主要学习)

SocketType.Raw + ProtocolType.Icmp = Internet控制报文协议(了解)

SocketType.Raw + ProtocolType.Raw = 简单的IP包通信(了解)

我们必须掌握的

//TCP流套接字

Socket socketTcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//UDP数据报套接字

Socket socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);


Socket的常用属性

//1.套接字的连接状态

if(socketTcp.Connected)

{

}

//2.获取套接字的类型

print(socketTcp.SocketType);

//3.获取套接字的协议类型

print(socketTcp.ProtocolType);

//4.获取套接字的寻址方案

print(socketTcp.AddressFamily);

//5.从网络中获取准备读取的数据数据量

print(socketTcp.Available);

//6.获取本机EndPoint对象(注意 :IPEndPoint继承EndPoint)

//socketTcp.LocalEndPoint as IPEndPoint

//7.获取远程EndPoint对象

//socketTcp.RemoteEndPoint as IPEndPoint


Socket的常用方法

//1.主要用于服务端

//  1-1:绑定IP和端口

IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(“127.0.0.1”), 8080);

socketTcp.Bind(ipPoint);

//  1-2:设置客户端连接的最大数量

socketTcp.Listen(10);

//  1-3:等待客户端连入

socketTcp.Accept();

//2.主要用于客户端

//  1-1:连接远程服务端

socketTcp.Connect(IPAddress.Parse(“118.12.123.11”), 8080);

//3.客户端服务端都会用的

//  1-1:同步发送和接收数据

//  1-2:异步发送和接收数据

//  1-3:释放连接并关闭Socket,先与Close调用

socketTcp.Shutdown(SocketShutdown.Both);

//  1-4:关闭连接,释放所有Socket关联资源

socketTcp.Close();

TCP和UDP两种长连接通信方案都是基于Socket套接字的

Socket套接字TCP通信

https://i-blog.csdnimg.cn/direct/410ccde77b054688b11d1afb2b3d93e9.png

TCP协议三次握手的体现

https://i-blog.csdnimg.cn/direct/80551bb3eb0e4cf99dde4bc21a8ea627.png

https://i-blog.csdnimg.cn/direct/99b0f1a6481645dda764c27537957d4e.png

TCP协议四次挥手的体现

https://i-blog.csdnimg.cn/direct/442bd7c8214e4fd6b14207679b8e4bcf.png

https://i-blog.csdnimg.cn/direct/0e4b06af4dde4d398452fabd3564f9fb.png

总结

Socket通信是Unity网络通信中的基础且重要的部分。通过深入理解Socket的原理和使用方法,开发者可以实现高效、安全、可靠的网络通信功能,为Unity游戏或应用提供稳定的网络连接和数据传输服务。