桃李春风一杯酒,江湖夜雨十年灯
一、 TCP简介
①特点
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP全称是:传输控制协议 (Transmission Control Protocol),在传输数据之前,必须使用严格的协议建立连接,也就是俗称的握手,握手成功才开始正确的交付数据。
当连接到一个站点时,必须指明其地址和该地址的端口 : 地址是一个 32 位的数字,通常由32个以点分开的数组成的字符串表示,如 192.168.0.1;端口是介于 0和65535 之间的数,并且允许同时打开不只一个连接。
优点:传输可靠稳定,即数据在传输过程中不会丢失;
缺点:占用带宽较多,传输速率相对较慢。
②数据传输的流程
客户端:
(1)请求一个 TCP 连接(TCP open connection),可以设置超时以避免服务器未响应时挂起
(2)读 /写数据,数据以字节流传递
服务端:
(1) 等待连接 ( TCP Listen )
(2) 读 /写数据,数据以字节流传递
(3) 关闭连接
③与UDP的区别
我之前写过一篇关于LabVIEW UDP通信的文章LabVIEW如何使用UDP协议进行通信?大家可以参考对比下。后来我在网上找到一位大佬发布的图片,生动阐明了这两种传输协议的差别,我盗图过来给大伙瞧瞧!我只能说大佬不愧是大佬,废话一句没有,一图搞定所有:
二、 实战练习
①开发环境
Win10家庭版(64位);LabVIEW2017(32位);网络调试助手5.0.2
②实例说明
我写了两个简单的程序:Client端程序和Server端程序,然后分别与网络调试助手通信,并与网络调试助手之间进行数据的收发,为了方便数据展示,在前面板我把字符串显示框和字符串输入框均设置为16进制显示模式。LabVIEW与调试助手建立通信后,互相显示对方发送过来的数据。
在LabVIEW中提供了多种网络通信方式:TCP、UDP以及Socket。与TCP相关的函数位于一个专门的面板中,如下图所示:
使用该面板中的函数,就可以进行TCP相关的编程,下面给出了Client端和Server端的具体实现程序。
③Client端程序及结果
TCP Client端前面板以及程序面板如下图所示,前面板比较简单,只有一个数据输入框(用来发送数据)和一个数据输入框(用来接收数据)。
程序框图中,“打开TCP连接”模块有两个参数需要填写,分别是“IP地址”和“端口号”,即服务端程序所在主机的IP地址及服务器端程序设置的端口号,由于Client程序与调试助手都在一台主机上,所以IP地址直接用127.0.0.1,调试助手上端口号设置的是6666,所以程序上的端口号也设为6666。两个参数设置好以后,该模块就可以尝试与对应的Server端进行通信连接。
“读取TCP数据”模块就是读取对应主机发送过来的数据,这个模块有个参数比较重要:读取的字节。Server端发送的数据有几个字节,这里就填写相应的数字,与发送端保持一致,不然会导致无法接收到数据或者收到的数据来回变动,不利于后期的数据处理,通信结束后断开连接。
两端通信结果如下图所示:
将网络调试助手设置TCP Server模式,然后设置好IP和Port,将发送和接收都设置为HEX模式,就可以与Client端通信了。分别在两端的数据输入框输入不同的数据,以便于观察。
唯一需要注意一点就是,由于客户端的程序包含read和write两部分,当客户端和调试助手同时运行的时候,此时如果我们不点击调试助手的发送按钮,调试助手和客户端均收不到数据的,因为客户端的循环程序会卡在“read”这个模块这里,后面的write也就不会运行;所以,点下发送按钮或者勾选循环发送选项,双方就可以不停地收发了。
通过下图可知,客户端收到了调试助手发送过来的数据,调试助手也受到了客户端发送的数据。
④Server端程序及结果
TCP Server端前面板以及程序面板如下图所示,前面板与上面的client端是一样的,一收一发两个字符串框。程序面板的程序也大致一样,最大的不同就是“TCP侦听”模块,该模块需要设置IP地址和端口号,也就是服务端程序所在的主机的IP地址以及端口号。端口号可以随意设置,如果被主机的特定程序占用了,就换一个端口号。设置完以后参数以后,让程序运行,程序就开始监听,看是否有对应的客户端的尝试握手连接。
两端通信结果如下图所示:
将网络调试助手设置TCP Client模式,然后设置好IP和Port,将发送和接收都设置为HEX模式,就可以与Server端通信了。写入的字节这个参数可要可不要。
三、 小结
(1)LabVIEW基于字节流的TCP传输协议决定了发送和接收的数据只能是字符串格式,一阵数据就是一个字符串,所以在对数据进行发送之前需要把不同类型的数据转换成字符串,然后再进行发送;数据转换部分可以参考我之前写的帖子。
(2)在“读取TCP数据”这个模块上的“读取的字节数”这个参数一定要设置正确,不然接收到的会不停的滚动,为接下来的数据处理带来麻烦;例如我在上图Server端程序中设置该参数为8,但是我在网络调试助手里发送的一帧数据是18个字节,这个时候LabVIEW前面板读到的数据就会不停的滚动,这个时候就需要将该参数设置为18。
(3)如果是在两台电脑上进行通信,那么需要两台硬件的IP地址设置为同一字段,不然将会出现无法连接的情况;由于我的LabVIEW编写的软件和网络调试助手都在一台电脑上运行,IP地址就可以直接使用“127.0.0.1”、空字符串或者使用本机设定的固定IP都行。