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. 2つのリクエストを送信できます。1つはファイル名を使用し、もう1つはデータを使用します。

于 2012-12-10T13:12:26.770 に答える
6

本当に簡単な方法はありません。独自のプロトコルを作成する必要があります。ただし、そのプロトコルは非常に単純なプロトコルであることがよくあります。

書き終わりの簡単な例

  1. を使用してQStringファイル名をQByteArrayに変換しますQString::toUtf8()
  2. QByteArray の長さをバイナリ int としてソケットに書き込みます
  3. ファイル名を含む QByteArray からのバイトをソケットに書き込みます
  4. ファイルの長さをバイナリ int としてソケットに書き込みます
  5. ファイルからバイトをソケットに書き込みます
  6. 近い

読み取り終了時:

  1. ファイル名の長さを示す整数を読み取る
  2. そのバイト数を QByteArray に読み込みます
  3. を使用してファイル名を QByteArray から QString に変換しますQString::fromUtf8()
  4. データの長さを示す整数を読み取る
  5. その数のバイトを取得するまで、バイトの読み取りとファイルへの書き込みを続けます
  6. 近い

書き込み時と読み取り時に異なるコンピューター間で通信する場合は、書き込み前に をネットワーク バイト オーダーに変換し、読み取り後にホスト バイト オーダーに戻す必要があります。また、「x86 バイト順序」を使用し、異なる CPU でデータを読み取る人は変換する必要があると定義することもできます...

于 2012-12-10T13:34:51.023 に答える