qt下的udp、tcp网络编程.pdf
《qt下的udp、tcp网络编程.pdf》由会员分享,可在线阅读,更多相关《qt下的udp、tcp网络编程.pdf(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、QT 网络编程TCP 一 TCP 即 Transmission Control Protocol,传输控制协议。与 UDP 不同,它是面向连接和数据流的可靠传输协议。也就是说,它能使一台计算机上的数据无差错的发往网络上的其他计算机,所以当要传输大量数据时,我们选用 TCP 协议。TCP 协议的程序使用的是客户端/服务器模式,在 Qt 中提供了 QTcpSocket 类来编写客户端程序,使用 QTcpServer 类编写服务器端程序。我们在服务器端进行端口的监听,一旦发现客户端的连接请求,就会发出 newConnection()信号,我们可以关联这个信号到我们自己的槽函数,进行数据的发送。而在客
2、户端,一旦有数据到来就会发出 readyRead()信号,我们可以关联此信号,进行数据的接收。其实,在程序中最难理解的地方就是程序的发送和接收了,为了让大家更好的理解,我们在这一节只是讲述一个传输简单的字符串的例子,在下一节再进行扩展,实现任意文件的传输。一、服务器端。在服务器端的程序中,我们监听本地主机的一个端口,这里使用 6666,然后我们关联newConnection()信号与自己写的 sendMessage()槽函数。就是说一旦有客户端的连接请求,就会执行 sendMessage()函数,在这个函数里我们发送一个简单的字符串。1.我们新建 Qt4 Gui Application,工程名
3、为“tcpServer”,选中 QtNetwork 模块,Base class选择 QWidget。(说明:如果一些 Qt Creator 版本没有添加模块一项,我们就需要在工程文件中添加一行代码:QT+=network)2.我们在的设计区添加一个 Label,更改其 objectName 为 statusLabel,用于显示一些状态信息。如下:3.在文件中做以下更改。添加头文件:#include 添加 private 对象:QTcpServer*tcpServer;添加私有槽函数:private slots:void sendMessage();4.在文件中进行更改。在其构造函数中添加代码:
4、tcpServer=new QTcpServer(this);if(!tcpServer-listen(QHostAddress:LocalHost,6666)样服务器的程序就完成了,我们先运行一下程序。二、客户端。我们在客户端程序中向服务器发送连接请求,当连接成功时接收服务器发送的数据。1.我们新建 Qt4 Gui Application,工程名为“tcpClient”,选中 QtNetwork 模块,Base class选择 QWidget。2,我们在中添加几个标签 Label 和两个 Line Edit 以及一个按钮 Push Button。其中“主机”后的 Line Edit 的 ob
5、jectName 为 hostLineEdit,“端口号”后的为 portLineEdit。“收到的信息”标签的 objectName 为 messageLabel messageLabel。3.在文件中做更改。添加头文件:#include 添加 private 变量:QTcpSocket*tcpSocket;QString message;文件中做更改。(1)在构造函数中添加代码:tcpSocket=new QTcpSocket(this);connect(tcpSocket,SIGNAL(readyRead(),this,SLOT(readMessage();connect(tcpSock
6、et,SIGNAL(error(QAbstractSocket:SocketError),this,SLOT(displayError(QAbstractSocket:SocketError);这里关联了 tcpSocket 的两个信号,当有数据到来时发出 readyRead()信号,我们执行读取数据的 readMessage()函数。当出现错误时发出 error()信号,我们执行 displayError()槽函数。(2)实现 newConnect()函数。void Widget:newConnect()blockSize=0;oInt();们运行程序,同时运行服务器程序,然后在“主机”后填
7、入“localhost”,在“端口号”后填入“6666”,点击“连接”按钮,效果如下。可以看到我们正确地接收到了数据。因为服务器端和客户端是在同一台机子上运行的,所以我这里填写了“主机”为“localhost”,如果你在不同的机子上运行,需要在“主机”后填写其正确的 IP 地址。到这里我们最简单的 TCP 应用程序就完成了,在下一节我们将会对它进行扩展,实现任意文件的传输。QT 网络编程TCP 二 在上一节里我们使用 TCP 服务器发送一个字符串,然后在 TCP 客户端进行接收。在这一节我们重新写一个客户端程序和一个服务器程序,这次我们让客户端进行文件的发送,服务器进行文件的接收。有了上一节的
8、基础,这一节的内容就很好理解了,注意一下几个信号和槽的关联即可。当然,我们这次要更深入了解一下数据的发送和接收的处理方法。一、客户端 这次我们先讲解客户端,在客户端里我们与服务器进行连接,一旦连接成功,就会发出connected()信号,这时我们就进行文件的发送。在上一节我们已经看到,发送数据时我们先发送了数据的大小信息。这一次,我们要先发送文件的总大小,然后文件名长度,然后是文件名,这三部分我们合称为文件头结构,最后再发送文件数据。所以在发送函数里我们就要进行相应的处理,当然,在服务器的接收函数里我们也要进行相应的处理。对于文件大小,这次我们使用了 qint64,它是 64 位的,可以表示一
9、个很大的文件了。1.同前一节,我们新建工程,将工程命名为“tcpSender”。注意添加 network 模块。2.我们在文件中将界面设计如下。这里“主机”后的 Line Edit 的 objectName 为 hostLineEdit;“端口”后的 Line Edit 的objectName 为 portLineEdit;下面的 Progress Bar 的 objectName 为 clientProgressBar,其value 属性设为 0;“状态”Label 的 objetName 为 clientStatusLabel;“打开”按钮的objectName 为 openButton;
10、“发送”按钮的 objectName 为 sendButton;3.在 文件中进行更改。(1)添加头文件#include (2)添加 private 变量:QTcpSocket*tcpClient;QFile*localFile;文件中进行更改。添加头文件:#include (1)在构造函数中添加代码:loadSize=4*1024;totalBytes=0;bytesWritten=0;bytesToWrite=0;tcpClient=new QTcpSocket(this);connect(tcpClient,SIGNAL(connected(),this,SLOT(startTransf
11、er();rg(fileName);该函数将在下面的“打开”按钮单击事件槽函数中调用。(3)实现连接函数。void Widget:send()oInt();rg(fileName);localFile-close();tcpClient-close();(6)实现错误处理函数。void Widget:displayError(QAbstractSocket:SocketError)们为了使程序中的中文不显示乱码,在文件中更改。添加头文件:#include 在 main 函数中添加代码:QTextCodec:setCodecForTr(QTextCodec:codecForLocale();6.
12、运行程序,效果如下。7.程序整体思路分析。我们设计好界面,然后按下“打开”按钮,选择我们要发送的文件,这时调用了 openFile()函数。然后我们点击“发送”按钮,调用 send()函数,与服务器进行连接。当连接成功时就会发出 connected()信号,这时就会执行 startTransfer()函数,进行文件头结构的发送,当发送成功时就会发出 bytesWritten(qint64)信号,这时我们执行 updateClientProgress(qint64 numBytes)进行文件数据的传输和进度条的更新。这里使用了一个 loadSize 变量,我们在构造函数中将其初始化为 4*102
13、4 即 4 字节,它的作用是,我们将整个大的文件分成很多小的部分进行发送,每部分为 4 字节。而当连接出现问题时就会发出 error(QAbstractSocket:SocketError)信号,这时就会执行 displayError()函数。对于程序中其他细节我们就不再分析,希望大家能自己编程研究一下。二、服务器端。我们在服务器端进行数据的接收。服务器端程序是很简单的,我们开始进行监听,一旦发现有连接请求就发出 newConnection()信号,然后我们便接受连接,开始接收数据。1.新建工程,名字为“tcpReceiver”。2.我们更改文件,设计界面如下。其中“服务器端”Label 的
14、objectName 为 serverStatusLabel;进度条 Progress Bar 的objectName 为 serverProgressBar,设置其 value 属性为 0;“开始监听”按钮的 objectName为 startButton。效果如下。3.更改文件的内容。(1)添加头文件:#include (2)添加私有变量:QTcpServer tcpServer;QTcpSocket*tcpServerConnection;qint64 totalBytes;改文件。(1)在构造函数中添加代码:totalBytes=0;bytesReceived=0;fileNameSi
15、ze=0;connect(&tcpServer,SIGNAL(newConnection(),this,SLOT(acceptConnection();rg(fileName);bytesReceived+=fileNameSize;localFile=new QFile(fileName);if(!localFile-open(QFile:WriteOnly)qDebug()“open file error!”;return;else return;if(bytesReceived totalBytes)rg(fileName);(5)错误处理函数。void Widget:displayEr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- qt udp tcp 网络 编程
限制150内