java - 通过套接字以字节形式传输图像数据时,我不断收到 UTF 错误

标签 java android image sockets networking

我正在尝试使用连接到 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)

谢谢。

最佳答案

我的猜测是 int length = in.read(data); 不会读取已发送的所有字节,as documented :

Reads some number of bytes from the contained input stream and stores them into the buffer array b. The number of bytes actually read is returned as an integer

(强调我的)

因此,下一次迭代尝试将图像的未读字节读取为 UTF,但失败了。始终使用循环从流中读取字节,一旦读取了所有预期数量的字节,循环就会停止。

要确认这是真正的问题,请调试并查看返回的长度是否与实际长度匹配。

关于java - 通过套接字以字节形式传输图像数据时,我不断收到 UTF 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18418913/

相关文章:

java - 最大化表单的负载

android - Android 中是否有更简洁的点击监听器方法?

android - 处理 Android 设备关闭(ISSUE : The intent is received only the first time)

javascript - 如何在文档准备好和图像加载后调用函数?

java - 查找JDK是openJDK还是Oracle JDK

java - 请求以 Http/0.9 版本发送

java - 交互 LinkedList 时的 Null 检查抛出 NullPointerException

android - 从 ViewPager 中的子 fragment 通知他的父事件

image - 图像响应网页设计的裁剪顶部

javascript - 如何遍历图像数组并将它们呈现在 React 的组件中?