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 回答