QT5界面程序和VS程序的TCP/IP通信,发送数组、结构体等
由于项目需要,本人开发的一个界面程序需要和其他同事编写的VS程序进行TCP/IP通信,且根据通信协议要发送数组或者结构体,折腾了两天终于搞通了,记录一下,也算是和大家分享一下,省的再走弯路。
一、首先介绍一下需求:
1.QT5(基于QTCreator)编写的界面程序作为TCP的server端,以接收数据为主,发送为辅。
2.VS2010程序作为TCP的client端,以发送数据为主,接收为辅。
3.这里为了示例,需要发送的数据为一组浮点型数组:float sendpacket[4] = {10.5,20.5,30.5,40.5}。
二、下面分别介绍两端的具体实现方法。
1.TCP通信Client端的实现(基于VS2010)并附上源码(不上源码的都是耍流氓)
首先添加头文件相关
#include <WinSock2.h> #include <stdio.h> #pragma comment(lib, "Ws2_32.lib") #define SERVERPORT 6006
然后在main函数中实现加载套接字、创建套接字、连接到服务器、发送相关参数等步骤。这里各种博客里都一坨一坨的源码,我就只贴上最关键的发送数据的程序段。
float snedpacket[4]={10.5,20.5,30.5,40.5}; send(sockClient, (char *)&snedpacket, sizeof(snedpacket),0); printf("send: %f %f %f %f ", snedpacket[0],snedpacket[1],snedpacket[2],snedpacket[3]);其实很简单的就实现了,只需要将发送的七十地址强制转换成char*即可。
2.TCP通信Server端的实现(基于QT5.8 Creator)
首先还是头文件相关
#include <QtNetWork>并在工程文件内添加
QT += network然后就是数据的读取了,几个关键的信号和槽如下:
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnect())); connect(clientConnection,SIGNAL(readyRead()),this,SLOT(readMessage())); connect(clientConnection,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));然后就是实现数据的读取了,由于readyRead并不知道数据的大小,只要有数据就会触发它,因此需要你来定义何时来读取数据,而且TCP是以数据流的方式来进行数据传输的,读取数据后需要手动进行解读才能实现你要的数据数组或者结构体。具体来说:
做如下定义:
QByteArray receive_result_Message; float tcpRecvData[4] = {0,0,0,0}; quint16 blockSize;规定:
blockSize = sizeof(tcpRecvData);并用blockSize来验证收到的数据是不是你要的那么大的一段数据流,如果是的就读进来,不是就继续等待知道有这么大了在读,读取的源代码如下:
qDebug() << "read before:"<<tcpRecvData[0]<<tcpRecvData[1]<<tcpRecvData[2];//先打印一下看看数据 if(clientConnection->bytesAvailable() < blockSize) return;//判断数据流大小 receive_result_Message = clientConnection->readAll();//读取 memcpy(&tcpRecvData, receive_result_Message, sizeof(tcpRecvData));//数据转换 qDebug() << "read after:"<<tcpRecvData[0]<<tcpRecvData[1]<<tcpRecvData[2]<<tcpRecvData[3];//再打印一下看看数据按照如上的方法就可以完整的实现浮点型数据的接收了,程序输出正常。
3.注意事项
a.这个方法只能实现较小的数据流的读取,大型的数据或文件不可以。
b.readAll()一次能够读取的数据流大小和你的网络情况有关,也和你的电脑性能有关,这一点需要注意。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: QT下将数组里的数据画成曲线
- 下一篇: php的mysql性能优化