title: Java ImageIO is insanely slow
body: <p>I'm making a program that sends the clients screen to the server and displays it but it's being extremely slow. It's taking 2-3 seconds for one frame and the upload/download speed is not a problem. Is there anything I'm doing wrong/anything I can change to speed this up?</p>
  
  <p>Server:</p>
  
  <pre><code>import java.awt.BorderLayout;
  import java.awt.image.BufferedImage;
  import java.io.IOException;
  import java.net.ServerSocket;
  import java.net.Socket;
  import java.util.zip.GZIPInputStream;
  
  import javax.imageio.ImageIO;
  import javax.swing.ImageIcon;
  import javax.swing.JFrame;
  import javax.swing.JLabel;
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  
  public class Server {
  
      public static void main(String[] args) {
          try {
              JPanel panel = new JPanel();
              panel.setLayout(new BorderLayout());
  
              JLabel label = new JLabel();
              label.setSize(800, 600);
              label.setVisible(true);
  
              JScrollPane scroll = new JScrollPane();
              scroll.getViewport().add(label);
              panel.add(scroll, BorderLayout.CENTER);
  
              JFrame frame = new JFrame();
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.getContentPane().add(panel);
              frame.setSize(800, 600);
              frame.setVisible(true);
  
              ServerSocket serverSocket = new ServerSocket(25565);
              Socket socket = serverSocket.accept();
              GZIPInputStream in = new GZIPInputStream(socket.getInputStream());
              BufferedImage image = null;
              while(socket.isConnected()) {
                  image = ImageIO.read(in);
                  if(image != null) {
                      label.setIcon(new ImageIcon(image));
                      label.repaint();
  
                  }
              }
              in.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }
  </code></pre>
  
  <p>Client:</p>
  
  <pre><code>import java.awt.AWTException;
  import java.awt.Rectangle;
  import java.awt.Robot;
  import java.awt.Toolkit;
  import java.io.IOException;
  import java.net.Socket;
  import java.util.zip.GZIPOutputStream;
  
  import javax.imageio.ImageIO;
  
  public class Client {
  
      public static void main(String[] args) {
          try {
              Robot robot = new Robot();
              Toolkit toolkit = Toolkit.getDefaultToolkit();
              Rectangle screen = new Rectangle((int) toolkit.getScreenSize().getWidth(), (int) toolkit.getScreenSize().getHeight());
              Socket socket = new Socket("127.0.0.1", 25565);
              GZIPOutputStream out = new GZIPOutputStream(socket.getOutputStream());
  
              while(socket.isConnected()) {
                  ImageIO.write(robot.createScreenCapture(screen), "png", out);
              }
              out.close();
          } catch (AWTException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }
  </code></pre>