流不读取整个图像

时间:2014-12-31 07:08:29

标签: java android image sockets

我通过套接字将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);

以下是结果如enter image description here

的图片

2 个答案:

答案 0 :(得分:0)

当您在发送图片后关闭套接字时,您不需要发送计数,因此您不需要ByteBufferByteArrayOutputStream,或ByteArrayInputStream。或睡觉。全部删除它们并将图像直接写入套接字输出流,并使用ImageIO.read()直接从套接字输入流中读取它。

答案 1 :(得分:0)

有一种常见的误解,即从套接字读取N个字节将返回N个字节。套接字读取调用将在时返回(通常在收到的字节中存在时间间隔,这在很大程度上取决于网络)。 N只是最大字节数。

要解决此问题,您可以循环,直到您需要所需的字节数,或使用DataOutputStreamDataInputStream等专用流,它们提供write()和{{1 }} 方法。它们还提供了readFully()writeInt(),这使得发送大小变得更容易。