好的,下面是一个使用Qt实现的客户端和服务端文件传输的示例代码:
客户端代码:
// 客户端
#include <QTcpSocket>
#include <QFile>
void sendFileToServer(const QString& filePath)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "无法打开文件:" << file.errorString();
return;
}
QTcpSocket socket;
socket.connectToHost("服务器IP地址", 12345); // 替换为实际的服务器IP地址和端口号
if (!socket.waitForConnected()) {
qDebug() << "无法连接到服务器:" << socket.errorString();
return;
}
// 发送文件名和大小给服务器
QString fileName = QFileInfo(file.fileName()).fileName();
qint64 fileSize = file.size();
QByteArray data = QString("%1:%2").arg(fileName).arg(fileSize).toUtf8();
socket.write(data);
// 发送文件内容给服务器
while (!file.atEnd()) {
QByteArray buffer = file.read(8192); // 每次读取8KB数据
socket.write(buffer);
if (!socket.waitForBytesWritten()) {
qDebug() << "写入套接字错误:" << socket.errorString();
break;
}
}
// 关闭套接字和文件
socket.close();
file.close();
}
服务端代码:
// 服务端
#include <QTcpServer>
#include <QTcpSocket>
#include <QFile>
void receiveFileFromClient()
{
QTcpServer server;
if (!server.listen(QHostAddress::Any, 12345)) { // 监听所有IP地址,端口号为12345
qDebug() << "无法启动服务器:" << server.errorString();
return;
}
while (true) {
if (!server.waitForNewConnection()) {
qDebug() << "等待客户端连接超时";
continue;
}
QTcpSocket *clientSocket = server.nextPendingConnection();
// 读取客户端发送的文件名和大小
QByteArray data = clientSocket->readAll();
QString receivedData(data);
QStringList parts = receivedData.split(':');
if (parts.size() != 2) {
qDebug() << "接收到的数据格式不正确";
clientSocket->close();
delete clientSocket;
continue;
}
QString fileName = parts.at(0);
qint64 fileSize = parts.at(1).toLongLong();
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
qDebug() << "无法打开文件进行写入:" << file.errorString();
clientSocket->close();
delete clientSocket;
continue;
}
// 接收文件内容并写入文件
qint64 bytesReceived = 0;
while (bytesReceived < fileSize) {
if (!clientSocket->waitForReadyRead()) {
qDebug() << "从套接字中读取数据错误:" << clientSocket->errorString();
break;
}
QByteArray buffer = clientSocket->readAll();
file.write(buffer);
bytesReceived += buffer.size();
}
// 关闭套接字和文件
clientSocket->close();
delete clientSocket;
}
}
以上代码仅提供一个基本示例,实际应用中你可能需要添加更多的错误处理、进度更新和安全性措施。同时,请将代码中的”服务器IP地址”替换为实际使用的值。
内容由零声教学AI助手提供,问题来源于学员提问