2016-02-12 135 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:所以你可能會得到一個異常,但永遠不會知道,因爲你完全忽略了所有異常,這是一個非常愚蠢的事情 - 爲什麼你至少沒有抓到例外和打印堆棧跟蹤? –