4

ソケットを介してQtサーバーに画像アップロードを送信し、Javaを使用して作成されたクライアントで視覚化しようとしています。これまで、両側で通信するための文字列のみを転送し、画像を送信するためのさまざまな例を試しましたが、結果はありませんでした。

qtで画像を転送するために使用したコードは次のとおりです。

QImage image;
image.load("../punton.png");
qDebug()<<"Image loaded";
QByteArray ban; // Construct a QByteArray object
QBuffer buffer(&ban);   // Construct a QBuffer object using the QbyteArray
image.save(&buffer, "PNG"); // Save the QImage data into the QBuffer
socket->write(ban);        

一方、Java で読み取るコードは次のとおりです。

BufferedInputStream in = new BufferedInputStream(socket.getInputStream(),1);
File f = new File("C:\\Users\\CLOUDMOTO\\Desktop\\JAVA\\image.png");
System.out.println("Receiving...");
FileOutputStream fout = new FileOutputStream(f);
byte[] by = new byte[1];
for(int len; (len = in.read(by)) > 0;){
fout.write(by, 0, len);
System.out.println("Done!");
}

Qt サーバーを閉じるまで Java のプロセスが停止し、その後、生成されたファイルが破損します。

これを行う必要があり、両方の言語でプログラミングするのは初めてなので、助けていただければ幸いです。

また、受信プロセスが終了してメッセージが表示される次のコマンドを使用しましたが、ファイルは破損しています。

socket->write(ban+"-1"); 
socket->close(); in qt. 

そしてJavaで:

System.out.println(by); 
String received = new String(by, 0, by.length, "ISO8859_1");
System.out.println(received);
System.out.println("Done!");

ここに画像の説明を入力

4

1 に答える 1

1

このような単純な方法では、ソケットを介してファイルを転送することはできません。受信者に手がかりを与えていない、何バイトが来ているのか。InputStream.read()の javadoc をよく読んでください。ストリームが閉じられるまで次のバイトを待っているため、レシーバーは無限ループに陥っています。socket->close()したがって、送信者側で呼び出すことで部分的に修正しました。理想的にはban、バッファの前に長さをソケットに書き込み、受信側でその長さを読み取り、そのバイト数だけを受信する必要があります。またflushclose受信したファイルを読み取ろうとする前に受信者ストリーム。

で何を達成したかったのか、まったくわかりませんsocket->write(ban+"-1")。ログに記録された出力は、%PNGどちらが正しいかで始まります。最後に表示"-1"されているのは、イメージ バイナリ ファイルに文字を追加したため、ファイルが破損したことを意味します。なんでそうなの?

いいえ、1x1 PNG のサイズは 1 バイトではありません。4 バイト (赤、緑、青、アルファ) もありません。PNG には、ヘッダーやコントロール チェックサムなどが必要です。ファイルシステム上のファイルのサイズを見てください。これはあなたの必要なbyサイズです。

于 2012-10-22T12:47:11.580 に答える