瞬时屏幕捕获Java

时间:2014-02-12 12:41:43

标签: java swing sockets screenshot

我正在开发一个基于套接字的java应用程序。它抓取客户端的屏幕并在服务器上的GUI中显示它。但问题是它只是在程序时显示客户端的屏幕开始了,不要改变它。这是我的代码 服务器端:

try {
    img = ImageIO.read(socket.getInputStream());

    while(true){
        ImageIcon icon = new ImageIcon(img);
        label.setIcon(icon);
    }
}
catch (IOException e) {}

客户端:

 public class Client{

  public static void main(String[] args) throws Exception{

 BufferedImage screenShot = new Robot().createScreenCapture(new         
 Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
 ImageIO.write(screenShot, "PNG", socket.getOutputStream());
  public static void main(String[] args) throws Exception{
     Socket socket = new Socket("localhost",1999);
     Chat chat = new Chat(socket);      
     Thread thread = new Thread(chat);
     thread.start();
 }      
}


 class Chat implements Runnable{
 private Socket socket;

public Chat(Socket socket){
    this.socket = socket;

}

@Override
public void run() {
    // TODO Auto-generated method stub
    try{ while(true){
    BufferedImage screenShot = new Robot().createScreenCapture(new   Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
    ImageIO.write(screenShot, "PNG", socket.getOutputStream());
    }}catch(Exception e){}


}}

错误: -
线程“Thread-3”中的异常java.lang.IndexOutOfBoundsException
    在javax.imageio.stream.FileCacheImageOutputStream.seek(未知来源)
    在javax.imageio.stream.FileCacheImageOutputStream.close(未知来源)
    at com.sun.imageio.stream.StreamCloser $ CloseAction.performAction(Unknown Source)
    在com.sun.imageio.stream.StreamCloser $ 1.run(未知来源)
    在java.lang.Thread.run(未知来源)
更新:
实际上我甚至在连接建立导致错误之前就关闭了套接字。 Else Nick的代码工作正常。

1 个答案:

答案 0 :(得分:1)

因为目前还不清楚,我想确保你已经生成了ImageIO.read调用正在运行的新线程;该行可能会阻塞该线程,直到发送一些内容供它读取。您希望在EDT上执行此操作。

假设您有,我建议您使用SwingUtilities.invokeLater来更新GUI。这是标准流程 - 它的作用是将更新放入队列中,因此下次GUI想要更新时,它知道该怎么做。

总而言之,您的代码看起来应该是这样的:

Thread awesomeThread = new Thread(new Runnable(){

    @Override
    public void run() {
        while(true){

            try{
                //Read the image
                final Image img = ImageIO.read(socket.getInputStream());
                System.out.println("Image Read");  //code for troubleshooting

                //Once an image is read, notify the GUI to update
                SwingUtilities.invokeLater(new Runnable(){
                    @Override
                    public void run() {
                        ImageIcon icon = new ImageIcon(img);
                        label.setIcon(icon);
                        System.out.println("Image updated"); //code for troubleshooting
                    }});
            } catch (IOException e) {}
        }
    }});

   awesomeThread.start();