0

SP カメラで写真を撮り、ソケット経由でサーバーに送信する Android アプリケーションを実装しました。

次の (JAVA) コードを使用して、ローカルに保存されている画像ファイルを読み取り、ソケットを介して連続したチャンクで送信しています。

FileInputStream fileInputStream = new FileInputStream( "my_image_file_path" );

int nRead;
byte[] data = new byte[16384];

try {
    while( (nRead = fileInputStream.read(data, 0, data.length)) != -1 ){
        networkOutputStream.write( data, 0, nRead );
    }

} catch( IOException e ){
    e.printStackTrace();
}
fileInputStream.close();

そして、それを読み取ってサーバーに保存するための次の (C/C++) コード:

char newbuffer[MAX_BUF_SIZE];
int checkOperation;

ofstream outfile( "image_file_path".c_str(), ofstream::binary );

do{
    checkOperation = read( clientSocketDescriptor, newbuffer, sizeof(newbuffer) );

    if( checkOperation < 0 ){

        cout << "Error in recv() function, received bytes = " << checkOperation << endl;
        exit(1);
    }else if (checkOperation != 0 ){

       /*
        * some data was read
        */
       cout << endl << "READ Bytes: " << checkOperation << endl;
       outfile.write( newbuffer, checkOperation );

       /*
        * emptying buffer for new incoming data
        */
       for(int i = 0; i < sizeof(newbuffer); i++){
          newbuffer[i] = 0;
       }
    }
}while( checkOperation =! 0 );

outfile.close();

Android クライアント アプリケーションは、ソケット内のすべてのバイトを正しく書き込み、whileループから正常に終了したようです。

whileただし、サーバー コードはループの最後の反復でスタックし、実行を継続できません。

  • サーバーが を読み取れないのはなぜEOFですか?
  • 画像を送信したり読み取ったりするためのコードが正しくありませんか?

私は本当に立ち往生しているので、どんな種類の助けにも感謝します!

4

1 に答える 1

3

を閉じていないnetworkOutputStreamので、C++ コードは終了したことを知りません。

出力ストリームを閉じる必要があります-これは明らかに、これ以上データを送信する必要がない場合にのみ実行可能です-または、プロトコルにメタデータを含めて、データの書き込みを開始する前に示す必要がありますあるか、後で「完了」インジケータとして何かを含めます。通常、私は長さの接頭辞を好みます。「完了」インジケータがデータに自然に表示される場合にエスケープを心配するよりもはるかに簡単です。

中途半端な家は、「ここにデータ長Xのチャンクがあります」と繰り返し言い、次に「完了しました。チャンクはもうありません」というメッセージを繰り返します(たとえば、「データ長0のチャンクがあります」など)。この方法では、事前に全長を知る必要はありません。

于 2012-08-22T09:37:42.377 に答える