以下是一个使用Qt和TCP传输文件的示例,使用QDataStream进行数据序列化和反序列化:
// 服务器端代码
QTcpServer server;
QTcpSocket* clientSocket;
void Server::startServer()
{
server.listen(QHostAddress::Any, 1234);
connect(&server, SIGNAL(newConnection()), this, SLOT(newConnection()));
}
void Server::newConnection()
{
clientSocket = server.nextPendingConnection();
connect(clientSocket, SIGNAL(readyRead()), this, SLOT(readData()));
}
void Server::readData()
{
QDataStream in(clientSocket);
in.setVersion(QDataStream::Qt_5_15);
// 接收文件名
QString fileName;
in >> fileName;
// 创建本地文件用于保存接收的数据
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
qDebug() << "Failed to open file for writing.";
return;
}
// 逐块接收并写入文件直到结束
QByteArray block;
qint64 totalReceived = 0;
while (clientSocket->bytesAvailable() > 0) {
block = clientSocket->readAll();
file.write(block);
totalReceived += block.size();
}
file.close();
qDebug() << "Received file: " << fileName << ", size: " << totalReceived << " bytes";
}
// 客户端代码
QString filePath = "/path/to/file.ext"; // 要发送的文件路径
QTcpSocket socket;
void Client::sendFile()
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Failed to open file for reading.";
return;
}
// 获取文件名
QString fileName = QFileInfo(file.fileName()).fileName();
// 连接服务器
socket.connectToHost(QHostAddress("127.0.0.1"), 1234);
if (!socket.waitForConnected()) {
qDebug() << "Failed to connect to server.";
return;
}
// 发送文件名
QDataStream out(&socket);
out.setVersion(QDataStream::Qt_5_15);
out << fileName;
// 逐块读取并发送文件直到结束
qint64 totalSent = 0;
while (!file.atEnd()) {
QByteArray block = file.read(8192);
socket.write(block);
totalSent += block.size();
}
file.close();
socket.disconnectFromHost();
qDebug() << "File sent: " << fileName << ", size: " << totalSent << " bytes";
}
这是一个基本的示例,用于在客户端和服务器之间通过TCP传输文件。你可以根据自己的需求进行更多的优化和处理。
内容由零声教学AI助手提供,问题来源于学员提问