Java 在通过套接字以字节形式传输图像数据时,我不断遇到UTF错误
我正试图通过使用Java程序连接到Android应用程序,将图像从我的电脑发送到我的手机 我用于发送图像的代码: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
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()阻塞,直到流中不再有任何内容可读取,即发送方已关闭流。