在Qt中,可以使用QTcpSocket或QUdpSocket来进行文件的传输,具体步骤如下:
服务器端创建一个QTcpServer对象,并监听指定的端口。
客户端创建一个QTcpSocket对象,并连接到服务器端的IP地址和端口号。
客户端向服务器端发送需要传输的文件名及其大小。
服务器端接收到客户端发送的文件名及其大小后,先创建一个空白文件,并根据接收到的文件大小分配足够的内存空间。
服务器端开始读取客户端发送的文件数据,并将其写入到创建好的空白文件中。
当所有数据都被成功写入到文件中后,客户端和服务器端均关闭套接字。
以下是一个简单的示例程序:
服务器端代码:
void Server::start() {
server = new QTcpServer(this);
connect(server, &QTcpServer::newConnection, this, &Server::onNewConnection);
if(!server->listen(QHostAddress::Any, 8888)) {
qDebug() << "Failed to start server.";
} else {
qDebug() << "Server started.";
}
}
void Server::onNewConnection() {
socket = server->nextPendingConnection();
connect(socket, &QTcpSocket::readyRead, this, &Server::onReadyRead);
}
void Server::onReadyRead() {
QByteArray data = socket->readAll();
if(data.startsWith("FILE:")) {
QString fileName;
qint64 fileSize = 0;
QDataStream in(&data, QIODevice::ReadOnly);
in.skipRawData(5); // 跳过"FILE:"
// 读取文件名
in >> fileName;
qDebug() << "Received file name:" << fileName;
// 读取文件大小
in >> fileSize;
qDebug() << "Received file size:" << fileSize;
// 创建文件
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly)) {
qDebug() << "Failed to create file.";
return;
}
// 分配内存空间
QByteArray buffer(fileSize, Qt::Uninitialized);
// 开始读取数据并写入文件
qint64 bytesRead = 0;
while(bytesRead < fileSize) {
qint64 bytesToRead = qMin(socket->bytesAvailable(), fileSize - bytesRead);
qint64 bytes = socket->read(buffer.data() + bytesRead, bytesToRead);
if(bytes == -1) {
qDebug() << "Failed to read data.";
break;
}
bytesRead += bytes;
file.write(buffer.data(), bytes);
}
file.close();
socket->close();
qDebug() << "File transfer completed.";
} else {
qDebug() << "Unknown command.";
}
}
客户端代码:
void Client::sendFile(QString fileName) {
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly)) {
qDebug() << "Failed to open file.";
return;
}
QByteArray data;
QDataStream out(&data, QIODevice::WriteOnly);
// 发送文件信息
out << QString("FILE:") << fileName << file.size();
// 发送文件数据
QByteArray buffer(file.readAll());
qint64 bytesWritten = socket->write(buffer);
if(bytesWritten == -1) {
qDebug() << "Failed to write data.";
return;
}
file.close();
socket->close();
qDebug() << "File transfer completed.";
}
在程序中,服务器端使用QTcpServer监听客户端的连接请求,并在接收到连接后,等待客户端发送文件名及其大小。如果接收到正确的命令,则创建一个空白的文件,并使用QDataStream读取客户端发送的数据,将其写入到文件中。当所有数据都被成功地写入到文件中后,关闭套接字。
客户端通过QTcpSocket连接到服务器端,并根据文件路径打开指定的文件。然后,使用QDataStream向服务器端发送文件名及其大小,并将文件数据一次性全部写入到套接字中。最后,关闭套接字,传输完成。
需要注意的是,以上示例程序只是一个简单的样例,实际应用中还需要考虑更多的错误处理和安全问题。