套接字接收延迟为1的图像

时间:2017-05-05 19:02:48

标签: android sockets stream bufferedimage

我有一个套接字通过一个没有关闭的InputStream接收图像。我想以这种方式连续发送图像。但现在图像得到了延迟1张图像(第一张发送第二张后,第二张发送第三张后,......)。我做错了什么?

服务器

  public static void readImages(InputStream stream) throws IOException    {
     stream = new BufferedInputStream(stream);
     BufferedImage image = null;
     int j = 0;

     while (true) {

        stream.mark(MAX_IMAGE_SIZE);

        ImageInputStream imgStream =  ImageIO.createImageInputStream(stream);
        Iterator<ImageReader> i = ImageIO.getImageReaders(imgStream);
        if (!i.hasNext()) {
            System.out.println("No more image readers");
            break;
        }

        ImageReader reader = i.next();
        reader.setInput(imgStream);

        image = reader.read(0);
        ImageIO.write(image,"jpg",new File("current" + j + ".jpg"));
        System.out.println("Save an image " + j);


        if (image == null) {
            System.out.println("Image is null");
            break;
        }

        long bytesRead = imgStream.getStreamPosition();

        stream.reset();
        stream.skip(bytesRead);
        j++;
    }
}

客户端

new Thread(new Runnable() {
            @Override
            public void run() {
                try {

                    OutputStream outputStream = server.getOutputStream();
                    ByteArrayOutputStream stream = new  ByteArrayOutputStream();
                    bitmapToSend =  Bitmap.createScaledBitmap(bitmapToSend, 900, 800, true);
                    bitmapToSend.compress(Bitmap.CompressFormat.JPEG,  100, stream);
                    byte[] byteArray = stream.toByteArray();
                    outputStream.write(byteArray);
                    outputStream.flush();
                } catch (IOException e) {
                    System.out.println("Socket not created");
                    e.printStackTrace();
                }
            }
        }).start();

注意我不关闭客户端的输出流,所以我可以一直发送图片。

1 个答案:

答案 0 :(得分:0)

使用ImageIO.getImageReaders(imgStream)对套接字流来说似乎不合逻辑,因为它可能希望所有图像一次可用。这可能是你拖延的原因。

其次,对于解压缩图像,有一个简单的方法BitmapFactory.decodeStream()。

第三,既然客户已经创建了一个&#34; JPG&#34;格式,服务器只需要存储它。您只需要在发送所有文件后立即发送字节数和零。

客户端:

new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                ByteArrayOutputStream memoryStream = new  ByteArrayOutputStream();
                Bitmap bitmapToSend =
                    Bitmap.createScaledBitmap(bitmapToSend, 900, 800, true);
                bitmapToSend.compress(
                     Bitmap.CompressFormat.JPEG,100, memoryStream);
                byte[] byteArray = memoryStream.toByteArray();
                memoryStream = null;

                DataOutputStream outputStream = 
                          new DataOutputStream(server.getOutputStream());
                outputStream.writeInt(byteArray.length);
                outputStream.write(byteArray);
                outputStream.flush();
            } catch (IOException e) {
                System.out.println("Socket not created");
                e.printStackTrace();
            }
        }
    }).start();

服务器:

public static void readImages(InputStream stream) {

    DataInputStream imgInput = new DataInputStream(stream);
    int index = 0;
    int byteLength;

    try {
        while ((byteLength = imgInput.readInt())>0) {

            byte[] buffer = new byte[byteLength];
            imgInput.readFully(buffer);

            OutputStream imgOutput = new FileOutputStream("current" + (index++) + ".jpg");
            imgOutput.write(buffer);
            imgOutput.close();
        }
    } catch (IOException ex) {
        // .............
    } finally {
        try {
            imgInput.close();
        } catch (IOException ex1) {
            //...........
        }
    }

}