在上一节里我们使用TCP服务器发送一个字符串,然后在TCP客户端进行接收。在这一节我们重新写一个客户端程序和一个服务器程序,这次我们让客户端进行文件的发送,服务器进行文件的接收。有了上一节的基础,这一节的内容就很好理解了,注意一下几个信号和槽的关联即可。当然,我们这次要更深入了解一下数据的发送和接收的处理方法。一、客户端这次我们先讲解客户端,在客户端里我们与服务器进行连接,一旦连接成功,就会发出connected()信号,这时我们就进行文件的发送。在上一节我们已经看到,发送数据时我们先发送了数据的大小信息。这一次,我们要先发送文件的总大小,然后文件名长度,然后是文件名,这三部分我们合称为文件头结构,最后再发送文件数据。所以在发送函数里我们就要进行相应的处理,当然,在服务器的接收函数里我们也要进行相应的处理。对于文件大小,这次我们使用了qint64,它是64位的,可以表示一个很大的文件了。,我们新建工程,将工程命名为“tcpSender”。work模块。。这里“主机”后的LineEdit的objectName为hostLineEdit;“端口”后的LineEdit的objectName为portLineEdit;下面的ProgressBar的objectName为clientProgressBar,其value属性设为0;“状态”Label的objetName为clientStatusLabel;“打开”按钮的objectName为openButton;“发送”按钮的objectName为sendButton;。(1)添加头文件#include<work>(2)添加private变量:QTcpSocket*tcpClient;QFile*localFile;//要发送的文件qint64totalBytes;//数据总大小qint64bytesWritten;//已经发送数据大小qint64bytesToWrite;//剩余数据大小qint64loadSize;//每次发送数据的大小QStringfileName;//保存文件路径QByteArrayoutBlock;//数据缓冲区,即存放每次要发送的数据(3)添加私有槽函数:privateslots:voidsend();//连接服务器voidstartTransfer();//发送文件大小等信息voidupdateClientProgress(qint64);//发送数据,更新进度条voiddisplayError(QAbstractSocket::SocketError);//显示错误voidopenFile();//。添加头文件:#include<QFileDialog>(1)在构造函数中添加代码:loadSize=4*1024;totalBytes=0;bytesWritten=0;bytesToWrite=0;tcpClient=newQTcpSocket(this);connect(tcpClient,SIGNAL(connected()),this,SLOT(startTransfer()));//当连接服务器成功时,发出connected()信号,我们开始传送文件connect(tcpClient,SIGNAL(bytesWritten(qint64)),this,SLOT(updateClientProgress(qint64)));//当有数据发送成功时,我们更新进度条connect(tcpClient,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));ui->sendButton->setEnabled(false);//开始使”发送“按钮不可用我们主要是进行了变量的初始化和几个信号和槽函数的关联。(2)实现打开文件函数。voidWidget::openFile()//打开文件{fileName=QFileDialog::getOpenFileName(this);if(!()){ui->sendButton->setEnabled(true);ui->clientStatusLabel->setText(tr(“打开文件%1成功!”).arg(fileName));}}该函数将在下面的“打开”按钮单击事件槽函数中调用。(3)实现连接函数。voidWidget::send()//连接到服务器,执行发送{ui->sendButton->set
客户端、服务端 来自淘豆网www.taodocs.com转载请标明出处.