网络:套接字Socket

Reading time ~1 minute

对于需要网络功能的程序,除非我们准备定义一些新的协议或者对细节进行更灵活的控制,否则的话,一般情况下不需要直接使用Socket类,而是使用进一步封装后的TcpListener类、TcpClient类以及UdpClient类来实现。这主要是因为使用socket编写程序比较麻烦,而且容易出错。但是,由于封装后的类不可避免地要涉及套接字的概念,因此我们还需要了解Socket的基本用法。

Socket 概念

Socket中文翻译是套接字,是支持TCP/IP网络通信的基本操作单元。它是应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口。它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

可以将套接字看作不同主机间的进程进行双向通信的端点,在一个双方可以通信的套接字实例中,既保存了本机的IP地址和端口,也保存了对方的IP地址和端口,同时也保存了双方通信采用的协议等信息。

套接字有3种不同的类型:流套接字、数据报套接字和原始套接字。 流套接字用来实现而向连接的TCP通信,数据报套接字实现无连接的UDP通信,原始套接字实现IP数据包通信。3种类型的套接字均可以使用system.NetSockets命名空间中的Socket类来实现。

Socket通信流程

面向连接的套接字

我们知道TCP和UDP协议,它们分别是面向连接和无连接的。在面向连接的Socket中,使用TCP来建立两个地址端点的会话。一旦建立这种连接,就可以在设备之间进行可靠的数据传输。 就好像打电话,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。

TCP Socket连接的过程可以简单的分为:1. 服务端监听 2. 客户端请求 3.建立连接。

服务器创建socket。 服务器为socket绑定ip地址和端口号。 服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开。

客户端创建socket。 客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket。

服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求。

客户端连接成功,向服务器发送连接状态信息。

服务器accept方法返回,连接成功。 客户端向socket写入信息。 服务器读取信息。

客户端关闭。 服务器端关闭。

无连接的套接字

UDP使用无连接的套接字,无连接的套接字不需要在网络设备之间发送连接信息。因此,很难确定谁是服务器谁是客户端。如果一个设备最初是在等待远程设备的信息,则套接字就必须用Bind方法绑定到一个本地”IP地址/端口”上。完成绑定之后,该设备就可以利用套接字接收数据了。由于发送设备没有建立到接收设备地址的连接,所以收发数据均不需要Connect方法。

由于不存在固定的连接,所以可以直接使用SendTo()方法和ReceiveFrom()方法发送和接受数据。两个主机之间通信结束后,可以像TCP一样,使用Shutdown和Close方法。

必须使用Bind方法绑定本地IP和端口后,才可以使用ReceiveFrom()方法接收数据,如果只发送不接收,就不用绑定。

关于Socket更多内容和示例请看 MSDN Socket 文档。

Scriptable Objects 及 游戏架构

Scriptable Objects 相关介绍,及基于其的游戏架构技术 Continue reading

AssetBundle 最佳实践

Published on January 29, 2019

AssetBundle 基础总结

Published on January 27, 2019