Hi,今天用一个小例子,陈述一下Qt里使用TCP通讯的流程。 代码链接: https:doc。qt。ioqt5examplesnetwork。html运行效果: Server端运行效果: 显示IP端口,然后静静地的等待客户端的连接。 源码文件:msgservermsgserver。promain。cppserver。cppserver。h 源码分析如下。 创建TCPServer 在构造函数中进行初始化:server。cppServer::Server(QWidgetparent):QDialog(parent),statusLabel(newQLabel){建立TCPServer,并监听tcpServernewQTcpServer(this);tcpServerlisten()获取Server的IP地址,并用其初始化UI〔。。。〕一旦有TCP连接,则调用sendMsg()发送数据给客户端connect(tcpServer,QTcpServer::newConnection,this,Server::sendMsg);} 要点: 1、QTcpServer是对TCPbasedserver的封装。 2、QTcpServer::listen()用于监听是否有客户端发起连接。 3、一旦有客户端访问,QTcpServer会发出newConnection()信号,我们通过绑定槽函数sendMsg()以实现发送消息的功能。 嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去! 无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。 点击这里找小助理0元领取:嵌入式物联网学习资料(头条) 获取ServerIP 在界面上显示服务端的IP信息:server。cppServer::Server(QWidgetparent):QDialog(parent),statusLabel(newQLabel){创建TCPServer〔。。。〕QStringipA获得所有的IP地址QListQHostAddressipAddressesListQNetworkInterface::allAddresses();解析出第一个可用的IPv4地址for(inti0;iipAddressesList。size();i){if(ipAddressesList。at(i)!QHostAddress::LocalHostipAddressesList。at(i)。toIPv4Address()){ipAddressipAddressesList。at(i)。toString();}}初始化UI〔。。。〕} 要点: 1、QNetworkInterface是对网络接口(例如lo、eth0。。。)的封装。 2、QNetworkInterface::allAddresses()会返回系统里所有的IP地址。 3、QHostAddress是对IP地址(IPv4、IPv6)的封装。 4、QHostAddress::toIPv4Address()会将点分式的IPv4地址转换为数字式,例如127。0。0。1会被转换为0x7F000001,失败则返回0。 给客户端发送消息 当有客户端连接到来时,槽函数sendMsg()会被调用:server。cppvoidServer::sendMsg(){PreparemessageQByteAQDataStreamout(block,QIODevice::WriteOnly);outmessage〔QRandomGenerator::global()bounded(message。size())〕;GetpendingconnectionQTcpSocketclientConnectiontcpServernextPendingConnection();connect(clientConnection,QAbstractSocket::disconnected,clientConnection,QObject::deleteLater);SendmessageclientConnectionwrite(block);clientConnectiondisconnectFromHost();} 要点: 1、QTcpSocket是对TCPSocket的封装。 2、为了与主机无关(字节序等),这里选用QByteArray以二进制的格式来存储数据。使用QDataStream可以轻松地将Message写到QByteArray里。 3、QDataStream从各种IO设备(QIODeice的子类),例如QByteArray、文件(QFile)等读写二进制数据。 4、从QTcpServer::nextPendingConnection()获得客户端的Socket。 5、用QTcpSocket::write()将Message通过网络发给客户端。 6、最后,通过QTcpSocket::disconnectFromHost断开连接,它会等待直到数据成功被写出去。 Client端运行效果: 每次点击GetMessage按钮,客户端都会从服务端随机获取到一条问候信息。 源码文件:msgclientmsgclient。proclient。cppclient。hmain。cpp创建TCPSocketclient。cppClient::Client(QWidgetparent):QDialog(parent),hostCombo(newQComboBox),portLineEdit(newQLineEdit),statusLabel(newQLabel(tr(ThisexamplesrequiresthatyouruntheMessageServerexampleaswell。))),getMsgButton(newQPushButton(tr(GetMessage))),tcpSocket(newQTcpSocket(this)){InitUI〔。。。〕SetupQDataStreamssourcein。setDevice(tcpSocket);in。setVersion(QDataStream::Qt510);Setupsignalslotconnect(getMsgButton,QAbstractButton::clicked,this,Client::requestNewMsg);connect(tcpSocket,QIODevice::readyRead,this,Client::readMsg);} 要点: 1、用QTcpSocket创建TCPSocket。 2、将QDataStream数据流的输入源设置为Socket。 3、设置信号槽:当Socket有数据时,调用readMsg()将其读走。 从服务端读取消息 当用户点击GetMessage按钮时,requestNewMsg()会被调用client。cppvoidClient::requestNewMsg(){getMsgButtonsetEnabled(false);tcpSocketabort();tcpSocketconnectToHost(hostCombocurrentText(),portLineEdittext()。toInt());} 要点: 1、QTcpSocket::connectToHost()向服务端发起连接。 2、该函数没有返回值,是因为当有错误发生时,socket会发出error()信号,我们可以通过绑定对应的槽函数进行错误处理。 3、成功连接后,服务端会随机发送一条信息过来,客户端接收到消息后,readMsg()会被调用。client。cppvoidClient::readMsg(){QSinnextFstatusLabelsetText(nextFortune);getMsgButtonsetEnabled(true);} 很简单的流操作,读到信息后,将其显示在界面上。 总结 用一张图总结一下QtTCP通讯流程: 原文链接:https:mp。weixin。qq。comsaCyV4HBwzTUZbCrdKsLtBw 文章转载自:老吴嵌入式 文章来源于:一小例子,了解TCP通讯流程Qt示例 原文链接:一小例子,了解TCP通讯流程Qt示例 版权声明:本文来源于网络,免费传达知识,版权归原作者所有,如涉及作品版权问题,请联系我进行删除