【问题标题】:Instantaneous Screen Capture Java即时屏幕捕获 Java
【发布时间】:2014-02-12 12:41:42
【问题描述】:

我正在开发一个基于套接字的 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(Unknown Source)
在 com.sun.imageio.stream.StreamCloser$CloseAction.performAction(Unknown Source)
在 com.sun.imageio.stream.StreamCloser$1.run(未知来源)
在 java.lang.Thread.run(未知来源)
更新:
实际上,我什至在连接建立之前就关闭了导致错误的套接字。 Else Nick 的代码运行良好。

【问题讨论】:

  • 您只读取和写入图像一次?循环执行! (在服务器端循环移动 imageio.read,在客户端完整的截屏功能!)。也许在一个 5 秒的计时器中
  • 你的意思是我应该在客户端文件中添加 While(true) 循环?
  • 是的,否则你只上传一张截图,因为代码只执行一次。在服务器上,您必须更频繁地读取套接字(创建一个 5 秒左右的计时器......)。
  • 好的,我尝试在客户端添加循环。但它仍然没有改变。并且我得到了计时器部分?
  • 您还可以在服务器端循环读取它。我刚刚提到,如果不是每 5 秒发送一次图像而不是淹没它不是更好。如果您不实施限制,它将产生大量流量。 (也许看看共同的客户端-服务器架构,以了解它是如何工作的以及如何获得发送-接收的最佳方式)。

标签: java swing sockets screenshot


【解决方案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();

【讨论】:

  • 好的,现在我在客户端文件的 ImageIo.write 行中得到一个新的异常 java.lang.IndexOutOfBoundsException。可能是什么原因造成的?
  • 我在您的示例中看不到任何与索引有关的代码,因此我怀疑您需要发布更多代码。但它很可能与数组或ArrayList 有关。堆栈跟踪是否随时引用您的代码?这应该会给你导致问题的线路。
  • 实际上堆栈没有给出任何行。它只是说线程3中的异常
  • 我只包含了客户端的完整代码,以及我在堆栈中遇到的错误。可能是什么原因造成的??
  • 我怀疑它来自run 方法。我建议在那里打印一个堆栈跟踪(如果你还没有)。您的代码非常混乱 - 您在 Client 类中嵌套了 main 方法。我认为一定是复制/粘贴错误。
猜你喜欢
  • 2012-04-19
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多