0

我正在尝试使用套接字发送 bmp 图像。我在android上有这样的代码:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
MainActivity.bmp.compress(Bitmap.CompressFormat.JPEG, 20,
                    stream);
byte[] byteArray = stream.toByteArray();
OutputStream os = echoSocket.getOutputStream();
os.write(byteArray,0,byteArray.length);
os.flush();

在 PC 上:

String q = SockIn.readLine();
File file = new File("filename.bmp");

FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(q);

在 bmp 文件中,我最多只能得到 401 个字节,这当然是损坏的 bmp 图像。我究竟做错了什么?

MODIFIED 修改PC端,现在代码为:

InputStream in_ = clientSocket.getInputStream();
OutputStream out_ = new FileOutputStream("filename.bmp");
final byte[] buffer = new byte[1024];
int read = -1;
int i = 0;
while ((read = in_.read(buffer)) != -1) {
out_.write(buffer, 0, read); 
System.out.println(i);
i++;

}

in_.close();
out_.close();


System.out.println("Done");

它永远不会到达最后一行( println("Done") )。当我关闭android程序时,它到达最后一行并且bmp成功打开

4

2 回答 2

0

您的阅读逻辑完全关闭。您只使用readLine()一次,然后将其写入文件。写入设备端套接字的数据是二进制的。这意味着尝试像文本一样阅读它(就像readLine()那样)将返回无意义的垃圾。它通常为 401 字节长的原因是readLine()它将查找第一个换行符组合并将所有内容作为String. 这不是你想要的。

你需要的是一个循环,只要套接字中有数据,它就会从套接字读取并写入文件。一个标准的复制循环在这里就足够了。

InputStream in = socket.getInputStream();
OutputStream out = new FileOutputStream(...);
final byte[] buffer = new byte[BUFFER_SIZE];
int read = -1;
while ((read = in.read(buffer)) != -1)
    out.write(buffer, 0, read);

in.close();
out.close();

请注意,上面的代码没有经过测试,但是可以达到这种效果的东西应该可以解决问题。

于 2013-06-02T16:14:28.490 回答
0

如果要发送字节,为什么要读取字符串?

仅当前一个不起作用时,才逐个尝试这些设置。

1. Read() 并且不要 Readline() 你在写什么

如果你写一个字节,读一个字节

Byte obj = SockIn.read();

2. 发送前对数组进行编码

Base64.encodeBase64String(byteArray);
于 2013-06-02T16:16:07.787 回答