如果服务端没有回复任何信息,可以在客户端使用定时器或者计数器来检测数据是否发送完毕。具体实现方法如下:
- 使用定时器:在发送数据之前启动一个定时器,每隔一段时间检查socket的bytesToWrite()函数返回值是否为0。如果为0,则说明数据已经全部发送完毕。
代码示例:
// 启动定时器 QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, ={
if(socket->bytesToWrite() == 0){
qDebug() << "Data sent successfully";
timer->stop();
}
}); timer->start(1000); // 每隔1秒检查一次
- 使用计数器:在循环中记录已经发送的小块数,并与总共需要发送的小块数进行比较。当两者相等时,说明数据已经全部发送完毕。
代码示例:
int numBlocksSent = 0; // 已经发送的小块数 for (int i = 0; i < numBlocks; ++i) {
QByteArray blockData;
int startPos = i * blockSize;
blockData.append(file_content.mid(startPos, qMin(blockSize, file_content.size() - startPos)));
data.append(blockData);
socket->write(data);
socket->flush();
// 清空data,准备发送下一个小块
data.clear();
numBlocksSent++;
}
data.append(char(0xDC));
// 发送最后一个小块和结束标志 socket->write(data); socket->flush();
// 检查是否发送完毕 if(numBlocksSent == numBlocks){
qDebug() << "Data sent successfully";
}