我正在尝试使用套接字发送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图像。我做错了什么?
改性 修改了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(“完成”))。当我关闭android程序时,它会到达最后一行并且bmp成功打开
答案 0 :(得分: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();
请注意,上面的代码没有经过测试,但是这样做会产生这种效果。
答案 1 :(得分:0)
如果要发送字节,为什么要读取字符串?
只有在前一个没有效果的情况下,才逐个尝试这些setp。
<强> 1。阅读()而不是Readline()你在写什么
如果你写一个字节,读一个字节
Byte obj = SockIn.read();
<强> 2。在发送
之前对您的阵列进行编码
Base64.encodeBase64String(byteArray);