如何在QTCPSocket上发送文件及其文件名?

时间:2012-12-10 12:09:40

标签: qt qtcpsocket qtnetwork qtcpserver

有没有简单的方法将文件发送到包含文件名的服务器,以便服务器和客户端中的文件名完全相同?

这是我的代码

发件人

QString path = QApplication::applicationDirPath()+"/belajardansa.bmp";
QFile inputFile(path);
QByteArray read ;
inputFile.open(QIODevice::ReadOnly);
while(1)
{
    read.clear();
    read = inputFile.read(32768*8);
    qDebug() << "Read : " << read.size();
    if(read.size()==0)
       break;
    qDebug() << "Written : " << socket->write(read);
    socket->waitForBytesWritten();
    read.clear();
}
inputFile.close();

接收机

QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
QBuffer* buffer = buffers.value(socket);

QByteArray read = socket->read(socket->bytesAvailable());
qDebug() << "Read : " << read.size();

QFile file(  ???); // what should I put in the bracket???
if(!(file.open(QIODevice::Append)))
{
    qDebug("File cannot be opened.");
    exit(0);
}
file.write(read);
file.close();

2 个答案:

答案 0 :(得分:6)

  1. 您可以创建自己的数据结构来表示文件内容及其文件名,并将其转换为QByteArray,反之亦然。

  2. 您可以发送两个请求:第一个包含文件名,第二个包含数据。

答案 1 :(得分:6)

没有非常简单的方法。您必须创建自己的协议。但是,该协议通常可以是非常简单的协议。

写作结束时,简单的例子

  1. 使用QString::toUtf8()
  2. 将QString文件名转换为QByteArray
  3. 将QByteArray的长度写为socket,为二进制int
  4. 将包含文件名
  5. 的QByteArray中的字节写入套接字
  6. 将文件长度写为socket in binary int
  7. 从文件
  8. 写入套接字
  9. 关闭
  10. 阅读结束:

    1. 读取整数,告诉文件名的长度
    2. 将多个字节读取到QByteArray
    3. 使用QString::fromUtf8()
    4. 将文件名从QByteArray转换为QString
    5. 读取整数告诉数据长度
    6. 继续读取字节并写入文件,直到获得那么多字节
    7. 关闭
    8. 在写入和读取时,如果要在不同的计算机之间进行通信,则应在写入之前将其转换为网络字节顺序,并在读取之后将其转换为主机字节顺序。您还可以决定定义,使用“x86字节排序”,任何读取具有不同CPU需求的数据的人都可以转换...