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

Java 在通过套接字以字节形式传输图像数据时,我不断遇到UTF错误,java,android,image,sockets,networking,Java,Android,Image,Sockets,Networking,我正试图通过使用Java程序连接到Android应用程序,将图像从我的电脑发送到我的手机 我用于发送图像的代码: byte[] data = imageToByteArray(img); sendMessage(Main.imageCheck + data.length); out.write(data); out.flush(); 这段代码是从我计算机上的Java程序运行的。sendMessage()方法是: public void sendMessage(String s) { i

我正试图通过使用Java程序连接到Android应用程序,将图像从我的电脑发送到我的手机

我用于发送图像的代码:

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[]数组,因此它尝试在.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(数据)未读取已发送的所有字节:

从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中实际读取的字节数作为整数返回

(强调矿山)

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


确认这是实际问题,调试并返回长度是否与实际长度匹配。

什么是代码> SeNeMaseAGE()/代码>?对不起,我编辑了这个帖子,包括<代码> sEndoMeXAGE()/代码> MaTiODF,就是这样,他应该考虑使用<代码>输入。代码>而不是.JB Nizet,你是对的。in.read(数据)的长度与发送的长度不同。我听从了Josh M的建议,而使用了现成的(数据)。它工作得更好,但我仍然得到错误,可能在大约15秒后。(当我试图将电脑屏幕发送到手机时,我发送了很多图像)您无法阅读,因为您正在循环读取N个图像。readFully()阻塞,直到流中不再有任何内容可读取,即发送方已关闭流。