我通过套接字将java pc应用程序的图像发送到android应用程序。我发送的图像由于某种原因没有完全读入android字节[],并且它对于解码了多少图像有不同的结果。这是我的代码
桌面:
Socket socket = new Socket("127.0.0.1", 59900);
// BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
OutputStream outputStream = socket.getOutputStream();
Robot r = new Robot();
Toolkit t = Toolkit.getDefaultToolkit();
Rectangle rect = new Rectangle(t.getScreenSize());
BufferedImage img = r.createScreenCapture(rect);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
byte[] size = ByteBuffer.allocate(4).putInt(baos.size()).array();
outputStream.write(size);
outputStream.write(baos.toByteArray());
//outputStream.flush();
System.out.println("Flushed: " + System.currentTimeMillis());
//Thread.sleep(12000);
System.out.println("Closing: " + System.currentTimeMillis());
socket.close();
Android代码
ServerSocket server = new ServerSocket(59900);
Socket socket = server.accept();
InputStream inputStream = socket.getInputStream();
System.out.println("Reading: " + System.currentTimeMillis());
byte[] sizeAr = new byte[4];
inputStream.read(sizeAr);
int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();
byte[] imageAr = new byte[size];
inputStream.read(imageAr);
// ByteArrayInputStream bis = new ByteArrayInputStream(imageAr);
bp = BitmapFactory.decodeByteArray(imageAr, 0, size);
以下是结果如
的图片答案 0 :(得分:0)
当您在发送图片后关闭套接字时,您不需要发送计数,因此您不需要ByteBuffer
,ByteArrayOutputStream
,或ByteArrayInputStream
。或睡觉。全部删除它们并将图像直接写入套接字输出流,并使用ImageIO.read()
直接从套接字输入流中读取它。
答案 1 :(得分:0)
有一种常见的误解,即从套接字读取N个字节将返回N个字节。套接字读取调用将在时返回(通常在收到的字节中存在时间间隔,这在很大程度上取决于网络)。 N只是最大字节数。
要解决此问题,您可以循环,直到您需要所需的字节数,或使用DataOutputStream
和DataInputStream
等专用流,它们提供write()
和{{1 }} 方法。它们还提供了readFully()
和writeInt()
,这使得发送大小变得更容易。