断是否接受到了完整的文件。而在服务器端,我们在发送数据时就要
首先发送实际文件的大小信息,但是,文件的大小一开始是无法预知
的,所以我们先使用了 out<<(quint16) 0;在 block 的开始添加了
一个 quint16 大小的空间,也就是两字节的空间,它用于后面放置
文件的大小信息。然后 out<
seek(0);返回到 block 的开始,加入实际的文件大
小信息,也就是后面的代码,它是实际文件的大小:out<<(quint16)
(block.size() – sizeof(quint16));
(2)在服务器端我们可以使用 tcpServer 的
nextPendingConnection()函数来获取已经建立的连接的 Tcp 套
接字,使用它来完成数据的发送和其它操作。比如这里,我们关联了
disconnected()信号和 deleteLater()槽函数,然后我们发送数据
clientConnection->write(block);
然后是 clientConnection->disconnectFromHost();它表示当发
送完成时就会断开连接,这时就会发出 disconnected()信号,而最
后调用 deleteLater()函数保证在关闭连接后删除该套接字
clientConnection。
5.这样服务器的程序就完成了,我们先运行一下程序。
二、客户端。
我们在客户端程序中向服务器发送连接请求,当连接成功时接收服务
器发送的数据。
1. .我们新建 Qt4 Gui Application,工程名为“tcpClient”,选
中 QtNetwork 模块,Base class 选择 QWidget。
2,我们在 widget.ui 中添加几个标签 Label 和两个 Line Edit
以及一个按钮 Push Button。
其中“主机”后的 Line Edit 的 objectName 为 hostLineEdit,“端口
号”后的为 portLineEdit。
“收到的信息”标签的 objectName 为 messageLabel 。
3.在 widget.h 文件中做更改。
添加头文件:#include
添加 private 变量:
QTcpSocket *tcpSocket;
QString message; //存放从服务器接收到的字符串
quint16 blockSize; //存放文件的大小信息
添加私有槽函数:
private slots:
void newConnect(); //连接服务器
void readMessage(); //接收数据
void displayError(QAbstractSocket::SocketError); //显示错
误
4.在 widget.cpp 文件中做更改。
(1)在构造函数中添加代码:
tcpSocket = new QTcpSocket(this);
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readM
essage()));
connect(tcpSocket,SIGNAL(error(QAbstractSocket::Socket
Error)),
this,SLOT(displayError(QAbstractSocket::SocketErr
or)));
这里关联了 tcpSocket 的两个信号,当有数据到来时发出
readyRead()信号,我们执行读取数据的 readMessage()函数。当
出现错误时发出 error()信号,我们执行 displayError()槽函数。
(2)实现 newConnect()函数。
void Widget::newConnect()
{
blockSize = 0; //初始化其为 0
tcpSocket->abort(); //取消已有的连接
tcpSocket->connectToHost(ui->hostLineEdit->text(),