在开始介绍socket前先补充补充基础知识,在此基础上理解网络通信才会顺理成章。
TCP/IP:Transmission Control Protocol/Internet Protocol,传输控制协议/因特网互联协议,又名网络通讯协议。
简单来说:TCP控制传输数据,负责发现传输的问题,一旦有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地,而IP是负责给因特网中的每一台电脑定义一个地址,以便传输。从协议分层模型方面来讲:TCP/IP由:网络接口层(链路层)、网络层、传输层、应用层。它和OSI的七层结构以及对于协议族不同,下图简单表示:
表1 TCP/IP结构
图1 TCP/IP关系图
现阶段socket通信使用TCP、UDP协议,相对应UDP来说,TCP则是比较安全稳定的协议了。本文只涉及到TCP协议来说socket通信。一般建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示,在握手基础上延伸socket通信的基本过程。
图2 三次握手 四次握手关系
在此基础上,socket连接过程:
服务器监听:服务器端socket并不定位具体的客户端socket,而是处于等待监听状态,实时监控网络状态。
客户端请求:客户端clientSocket发送连接请求,目标是服务器的serverSocket。为此,clientSocket必须知道serverSocket的地址和端口号,进行扫描发出连接请求。
连接确认:当服务器socket监听到或者是受到客户端socket的连接请求时,服务器就响应客户端的请求,建议一个新的socket,把服务器socket发送给客户端,一旦客户端确认连接,则连接建立。
注:在连接确认阶段:服务器socket即使在和一个客户端socket建立连接后,还在处于监听状态,仍然可以接收到其他客户端的连接请求,这也是一对多产生的原因。
下图简单说明连接过程:
代码可以详见,附件中的内容,不过唯一值得说一下的事情是,其实在TCP/IP传输的数据都应该是以字节为单位的。比如说传送50个double类型的数据就是传送400个字节的数组。所以在这个过程中,我们首先需要将这一类的数据首先转化成为字节数组才能进行传递。在这个过程中,LabVIEW主要是通过一个节点完成的转化。这个函数的主要的操作就是将任意类型的数据转化为字节数组然后在进行数据传输。
这里又要进行一个说明,由于C#本身的原因,所以在字节存储格式的时候都是由小端进行存储的,但是在TCP/IP传输格式的时候标准默认的时候都是用大端方式进行传输的,所以拿到的数据不能直接进行解析。由于这个原因这边编写一个可以完成大小端转化的类,方便用户在TCP/IP以及其他串口等类型的时候进行使用。其中GetBytes可以完成多种类型的转化,包括数值和数组。使用十分方便。
下图所示是范例运行的过程,其中127.0.0.1,是使用本机IP号的时候IP地址,其中一个是Server端一个是Client端。
同时与LabVIEW Simple TCP的范例可以共同使用,相互做Server与Client都没有问题。如下图所示。
领取专属 10元无门槛券
私享最新 技术干货