5

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

这是我的代码

发件人

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();
4

2 回答 2

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

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

于 2012-12-10T13:12:26.770 回答
6

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

在写作结束时,简单的例子

  1. 使用将 QString 文件名转换为 QByteArrayQString::toUtf8()
  2. 将 QByteArray 的长度作为二进制 int 写入套接字
  3. 写入包含文件名的 QByteArray 中的套接字字节
  4. 将文件长度作为二进制 int 写入套接字
  5. 写入套接字文件中的字节

在阅读结束时:

  1. 读取整数告诉文件名的长度
  2. 将那么多字节读取到 QByteArray
  3. 使用将文件名从 QByteArray 转换为 QStringQString::fromUtf8()
  4. 读取整数告诉数据的长度
  5. 继续读取字节并写入到文件,直到你得到那么多字节

读写时,如果要在不同的计算机之间进行通信,应在写入前转换成网络字节序,读取后转换回主机字节序。您还可以决定定义,您使用“x86 字节排序”,并且任何使用不同 CPU 读取数据的人都需要转换...

于 2012-12-10T13:34:51.023 回答