2016-02-12 123 views
0

我试图在同一网络上向另一台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) 
+0

你的意思是,像[例如,这]( http://stackoverflow.com/questions/18505406/java-tcp-can-only-retrieve-image-once/18509880#18509880)? – MadProgrammer

+1

你得到的例外是因为当你试图编写它时'image'是'null',但由于我们没有服务器组件,所以不可能知道为什么 – MadProgrammer

+0

谢谢@MadProgrammer你给出的例子,解决了我的问题。我使用了ByteArrayOutputStream,现在我的图像不是** null **了 –

回答

0

@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); 
    } 
} 
4

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

  • 使用SwingWorker执行长时间运行的后台任务,如读取图像。在你的情况下,你可能想要一个SwingWorker<Void, BufferedImage>,这样你就可以通过发布/处理方法对将BufferedImage传递给GUI。 Concurrency in Swing教程将告诉你如何使用这个工具的细节。
  • 请勿使用涂料方法进行绘制。
  • 改为在JFrame中显示的JPanel的paintComponent方法中绘制。请务必在您的覆盖范围内调用super的paintComponent方法。
  • 停下来考虑 - 你是否真的需要以这种方式传输图像,因为你传递了很多信息,可能比需要的更多?如果可能的话,最好将数据模型通过套接字传递,然后用数据重新创建一个视图。
  • 永远不要公开地忽略异常,因为你的代码正在做。至少抓住异常的堆栈跟踪。
+0

在上面的代码中,我已经关闭了摆动,我只是在命令行上运行它,然后它只接收一个图像。 –

+0

忽略我的挥杆,只关注我的查询 –

+0

@ArpitJindal:所以你可能会得到一个异常,但永远不会知道,因为你完全忽略了所有异常,这是一个非常愚蠢的事情 - 为什么你至少没有抓到例外和打印堆栈跟踪? –