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