0

Androidアプリに接続するJavaプログラムを使用して、コンピューターから電話に画像を送信しようとしています。

画像を送信するために使用するコード:

byte[] data = imageToByteArray(img);
sendMessage(Main.imageCheck + data.length);
out.write(data);
out.flush();

このコードは、私のコンピューターの Java プログラムから実行されます。sendMessage() メソッドは次のとおりです。

public void sendMessage(String s) {
    if (out != null && server.isConnected()) {
        try {
            out.writeUTF(s);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

画像やその他のデータを受け取るために使用するコード:

while ((input = in.readUTF()) != null) {
    if (!input.equalsIgnoreCase(pulseCheckMessage)) {
        if (input.contains(imageCheck)) {
            //byte[] data = Base64.decode(input.replace(imageCheck, ""), Base64.DEFAULT);
            byte[] data = new byte[Integer.parseInt(input.replace(imageCheck, ""))];
            int length = in.read(data);
            updateScreenImage = BitmapFactory.decodeByteArray(data, 0, length);
            MainActivity.this.runOnUiThread(updateUiRunnable);
        } else {
            inLine = "Received: " + input;
            MainActivity.this.runOnUiThread(updateUiRunnable);
        }
    }

    pulseTakenTime = System.currentTimeMillis();
    pulseCheckReceived = true;
    isAlive = true;
}

コメントアウトされたコード (base64 クラスを含む) は、Base64.encode を使用して画像データを文字列として送信し、byte[] 配列を文字列に変換して送信したときのものでした。スロー。そこで、より速いと思われるバイトを送信することにしました。

imageCheck と Main.imageCheck は同じ文字列です。アプリはその文字列を受け取り、それを認識し、byte[] 配列を期待するので、 in.read(data) を実行しようとしますが、エラーが発生します:

ERROR: java.nio.charset.ModifiedUtf8.decode(ModifiedUtf8.java:57)
ERROR: java.io.DataInputStream.decodeUTF(DataInputStream.java:444)
ERROR: java.io.DataInputStream.decodeUTF(DataInputStream.java:438)
ERROR: java.io.DataInputStream.readUTF(DataInputStream.java:433)
ERROR: com.mangopearapples.pccontroller.MainActivity.run(MainActivity.java:238)

ありがとう。

4

1 に答える 1

1

私の推測では、文書化int length = in.read(data);されているように、送信されたすべてのバイトを読み取るわけではありません:

含まれている入力ストリームからいくつかのバイトを読み取り、それらをバッファー配列 b に格納します。実際に読み取られたバイト数が整数として返されます

(私のものを強調)

そのため、次の繰り返しで画像の未読バイトを UTF として読み取ろうとしますが、失敗します。常にループを使用してストリームからバイトを読み取ります。これは、予想されるバイト数がすべて読み取られると停止します。

これが実際の問題であることを確認するには、デバッグして、返された長さが実際の長さと一致するかどうかを確認します。

于 2013-08-24T13:27:06.043 に答える