【问题标题】:send screenshots over network通过网络发送屏幕截图
【发布时间】:2016-02-13 17:34:00
【问题描述】:

我正在尝试将连续屏幕截图发送到同一网络上的另一台 PC。

我也用谷歌搜索了它,但我没有找到与我相关的东西。 以下是我的发送者和接收者代码。问题是只有第一张图像被接收然后被击中。 如果我打开 JFrame,那么 JPanel 中不会更新单个图像。请帮帮我:-(

imagesender.java

import java.awt.*;
import java.awt.image.*;
import java.net.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
class imagesender
{
    imagesender()throws Exception
    {
        Socket soc=new Socket("127.0.0.1",5555);
        OutputStream os=soc.getOutputStream();
        while(true)
        {
            try
            {
                Dimension dim=Toolkit.getDefaultToolkit().getScreenSize();
                Rectangle rec=new Rectangle(dim);
                Robot bot=new Robot();
                BufferedImage image=bot.createScreenCapture(rec);
                ImageIO.write(image,"jpeg",os);
                System.out.println("Image Sent");
            }
            catch(Exception e)
            {
                System.out.println(e);
            }
        }
    }
    public static void main(String aerg[])throws Exception
    {
        new imagesender();
    }
}

imagereciever.java

import java.awt.*;
import java.awt.image.*;
import java.net.*;
import javax.imageio.*;
import java.io.*;
import javax.swing.*;
class imagereciever extends JPanel
{
    static BufferedImage image;
    imagereciever()throws Exception
    {
        ServerSocket ss=new ServerSocket(5555);
        Socket soc=ss.accept();
        JFrame frame=new JFrame();
        frame.setSize(500,500);
        frame.setContentPane(this);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //frame.setVisible(true);
        InputStream is=soc.getInputStream();
        while(true)
        {
            try
            {
                image=ImageIO.read(is);
                //this.repaint();
                ImageIO.write(image,"jpeg",new File("C:\\Users\\Arpit Jindal\\Desktop\\screenshot.jpeg"));
                System.out.println("Image Recieved");
            }
            catch(Exception e)
            {e.printStackTrace()}
        }
    }
    public static void main(String aerg[])throws Exception
    {
        new imagereciever();
    }
    public void paint(Graphics g)
    {
        super.paint(g);
        g.drawImage(image,0,0,null);
    }
}

imagereciever.java 收到一张图片,然后无限次给出此错误,imagesender.java 继续发送图片:-

java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at javax.imageio.ImageIO.getWriter(ImageIO.java:1592)
at javax.imageio.ImageIO.write(ImageIO.java:1520)
at imagereciever.<init>(imagereciever.java:26)
at imagereciever.main(imagereciever.java:37)

【问题讨论】:

  • 你的意思是像this for example?
  • 您收到异常是因为image 在您尝试编写它时是null,但由于我们没有服务器组件,因此不可能知道原因
  • 感谢@MadProgrammer 你给出的例子,解决了我的问题。我使用了 ByteArrayOutputStream,现在我的图像不再是 null

标签: java swing sockets screenshot


【解决方案1】:

您的 GUI 完全忽略了 Swing 线程规则,所以我对它可能会卡住并不感到惊讶。建议:

  • 使用 SwingWorker 执行长时间运行的后台任务,例如读取图像。在您的情况下,也许 SwingWorker&lt;Void, BufferedImage&gt; 是您想要的,以便您可以通过发布/处理方法对将 BufferedImage 传递给 GUI。 Concurrency in Swing 教程会告诉你如何使用这个工具的细节。
  • 不要使用绘画方法。
  • 改为在 JFrame 中显示的 JPanel 的 paintComponent 方法中进行绘制。请务必在您的覆盖中调用 super 的 paintComponent 方法。
  • 别再考虑了——您是否真的需要以这种方式传输的图像,因为您正在传递大量信息,也许比需要的更多?如果可能,最好通过套接字传递数据模型,然后使用数据重新创建视图。
  • 永远不要像您的代码那样公然忽略异常。至少捕获异常的堆栈跟踪。

【讨论】:

  • 在上面的代码中我已经关闭了 swing,我只是在命令行上运行它然后它只接收一个图像。
  • 忽略我的挥杆,只关注我的查询
  • @ArpitJindal:所以你可能会得到一个异常但永远不会知道,因为你完全忽略了所有异常,这是一件非常愚蠢的事情——为什么你至少不捕获异常并打印堆栈跟踪?
  • @ArpitJindal:如果你确实得到了多张图片,你看起来会用新的图片覆盖之前的图片。
  • "java.lang.IllegalArgumentException: image == null!" imagereciever.java 中打印变量 e 时,此异常会无限次出现
【解决方案2】:

@MadProgrammer 给我的例子解决了我的问题。这是我的新代码:-

imagesender.java

import java.awt.*;
import java.awt.image.*;
import java.net.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
class imagesender
{
    imagesender()throws Exception
    {
        Socket soc=new Socket("127.0.0.1",5555);
        OutputStream os=soc.getOutputStream();
        while(true)
        {
            try
            {
                BufferedImage image=new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
                ByteArrayOutputStream baos=new ByteArrayOutputStream();
                ImageIO.write(image,"png",baos);
                baos.close();
                ObjectOutputStream oos=new ObjectOutputStream(os);
                oos.writeObject(baos.size()+"");
                os.write(baos.toByteArray());
                //System.out.println("Image Sent");
            }
            catch(Exception e)
            {
                System.exit(1);
            }
        }
    }
    public static void main(String aerg[])throws Exception
    {
        new imagesender();
    }

}

imagereciever.java

import java.awt.*;
import java.awt.image.*;
import java.net.*;
import javax.imageio.*;
import java.io.*;
import javax.swing.*;
class imagereciever extends JPanel
{
    static BufferedImage image;
    static Socket soc;
    static InputStream is;
    imagereciever()throws Exception
    {
        ServerSocket ss=new ServerSocket(5555);
        soc=ss.accept();
        is=soc.getInputStream();
        JFrame frame=new JFrame();
        frame.setSize(500,500);
        frame.setContentPane(this);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        while(true)
        {
            try
            {
                ObjectInputStream ois=new ObjectInputStream(is);
                int size=Integer.parseInt(ois.readObject().toString());
                ByteArrayOutputStream baos=new ByteArrayOutputStream(size);
                int sizeread=0,bytesin=0;
                byte[] buffer=new byte[1024];
                while(sizeread<size)
                {
                    bytesin=is.read(buffer);
                    sizeread+=bytesin;
                    baos.write(buffer,0,bytesin);
                }
                baos.close();
                ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray());
                image=ImageIO.read(bais);
                this.repaint();
            }
            catch(Exception e)
            {
                System.exit(1);
            }
        }
    }
    public static void main(String aerg[])throws Exception
    {
        new imagereciever();
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(image,0,0,null);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多