2012-12-10 6 views
5

サーバーとクライアントのファイル名がまったく同じになるように、ファイル名を含むファイルをサーバーに送信する簡単な方法はありますか?ここでQTCPSocketにファイル名を付けてファイルを送信する方法は?

は私のコードは、ファイルの内容とそのファイル名を表して、それを変換します独自のデータ構造を作成することができます

送信者

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

答えて

5
  1. ですQByteArrayに、またはその逆になります。

  2. 2つの要求を送信できます。最初はファイル名、2番目はデータです。

+0

あなたの返信ありがとうございますハンク、 あなたの最初の提案は少し複雑です私はC++とQtの初心者です。データ構造をQByteArrayに変換するためのサンプルコードを教えてください。 2番目の提案について ソケットデータにファイル名またはデータが含まれているかどうかをサーバーが認識できるように、ソケットデータを処理する方法。 –

5

本当に簡単な方法はありません。独自のプロトコルを作成する必要があります。しかし、そのプロトコルはしばしば非常に単純なプロトコルになります。ファイルを含むQByteArrayからバイトをソケットバイナリINT

  • ライトとしてQByteArrayの長さをソケットするQString::toUtf8()
  • ライトを使用してQByteArrayに、単純な例

    1. 変換QStringのファイル名をエンドの書き込みに

      名前

    2. ファイルの長さをバイナリintとして書き込む
    3. ファイルからバイトを書き込む
    4. 閉じる
    5. 読んで終わりに

    1. ファイル名の読み取り整数占い長
    2. のQStringのQByteArrayからQByteArray
    3. 変換ファイル名のバイト数が使用していることを読むQString::fromUtf8()
    4. データの長さを示す整数を読み取る
    5. バイトを読み込み、ファイルに書き込むあなたは
    6. 閉じる多くのバイトが

    あなたが異なるコンピュータ間で通信したい場合は、書き込みと読み取り、あなたが書き込む前にネットワークバイトオーダーに変換する必要があり、バック読んだ後にバイト順序をホストすることになったまで。あなたは "x86バイトオーダリング"を使用し、異なるCPUを持つデータを読んでいる人は誰でも変換する必要があることを定義することもできます。

  • +0

    お返事いただきありがとうございます。 あなたの提案はお試しに非常に便利です。しかし、初心者として私には1つの問題があります。 受信ソケットデータをケースに入れて、そのプロトコルの正しいステップにデータを置くことができます。 (一部のパッケージで送信されたTCP書き込みデータでわかっているように) –

    +0

    TCP/IPはストリームプロトコルであり、パケットではなくバイトを書き込み読み込みます。また、すべてのバイトの順序と送信を保証します。したがって、正確に同じバイトを正確に同じ順序で取得する(またはエラーと切断が発生する)ことを信頼できます。これは、TCP/IPがあなたにバイトのストリームだけのサイズのパケットを与えるわけではないので、あなた自身の "パ​​ケットサイズ"をソケットに書き込まなければならない理由です。 – hyde

    +0

    今すぐOKになりました:) ありがとうございました。 –

    関連する問題