如何通过QTCPSocket发送文件及其文件名?

如何通过QTCPSocket发送文件及其文件名?,qt,qtcpsocket,qtnetwork,qtcpserver,Qt,Qtcpsocket,Qtnetwork,Qtcpserver,有没有简单的方法将包含文件名的文件发送到服务器,以便服务器和客户端中的文件名完全相同 这是我的密码 发件人 QString path=QApplication::applicationDirPath()+“/belajardansa.bmp”; QFile输入文件(路径); QByteArray读取; open(QIODevice::ReadOnly); 而(1) { read.clear(); read=inputFile.read(32768*8); qDebug()字节可用(); qDeb

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

这是我的密码

发件人
QString path=QApplication::applicationDirPath()+“/belajardansa.bmp”;
QFile输入文件(路径);
QByteArray读取;
open(QIODevice::ReadOnly);
而(1)
{
read.clear();
read=inputFile.read(32768*8);
qDebug()字节可用();
qDebug()
  • 您可以创建自己的数据结构来表示文件内容及其文件名,并将其转换为QByteArray,反之亦然

  • 您可以发送两个请求:第一个带文件名,第二个带数据


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

    在写作的最后,举一个简单的例子

  • 使用
    QString::toUtf8()
  • 将QByteArray的长度作为二进制int写入套接字
  • 将包含文件名的QByteArray中的字节写入套接字
  • 将文件长度作为二进制int写入套接字
  • 将文件中的字节写入套接字
  • 接近
  • 在阅读结束时:

  • 读取告诉文件名长度的整数
  • 把那么多字节读到一个QByteArray中
  • 使用
    QString::fromUtf8()
  • 读取告诉数据长度的整数
  • 继续读取字节并将其写入文件,直到得到那么多字节
  • 接近

  • 在写入和读取时,如果要在不同的计算机之间进行通信,则应在写入之前将转换为网络字节顺序,在读取之后将转换为主机字节顺序。您还可以决定定义使用“x86字节顺序”谢谢你的回应Hank,你的第一个建议对我来说有点复杂,因为我是C++和QT中的新手。你能给我一个示例代码来把数据结构转换成QByteArray吗?关于你的第二个建议,如何对套接字数据进行说明,这样服务器就可以识别了。ze如果套接字数据包含文件名或数据。感谢您的回复,hyde,您的建议似乎非常有用。但对于我这个新手来说,有一个问题。如何对传入的套接字数据进行装箱,以便我可以将数据放入该协议的正确步骤中。(正如我们所知,在TCP中,在某些包中发送的书面数据。)TCP/IP是一种流协议,您可以写入和读取字节,而不是数据包。它还保证所有字节的顺序和传输。因此,您可以相信,您将以完全相同的顺序获得完全相同的字节(或者您将获得错误和断开连接)。这也是您必须编写自己的“数据包大小”的原因对于套接字,因为TCP/IP并没有给你一个大小的数据包,只给你一个字节流。还有一个澄清:你当然可以一次写入和读取多个字节的数据,这从你在写入和读取数据时使用的方法中可以明显看出。只是写的大小丢失了,接收者不知道你是否写入了例如10,然后100个字节,或者如果一次写入110个字节。
    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();