2013-12-12 54 views
3

我最近試圖創建一個程序,就像teamviewer一樣。它會很好,但我目前面臨一個問題。通過套接字發送圖像

我想讓我的程序通過套接字發送圖像。當我運行這段代碼時,它永遠不會輸出「Image should be sent!」,所以我認爲問題出現在ImageIO.write行中。

BufferedImage screencapture = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 
try { 
    ImageIO.write(screencapture, "jpg", socket.getOutputStream()); 
    System.out.println("Image should be sent!"); 
} catch (IOException ex){ 
    ex.printStackTrace(); 
} finally { 
    if (socket != null){ 
     try { socket.close(); } catch (IOException ex){} 
    } 
    System.out.println("Image sent and socket closed!"); 
} 

另一方面還有一個客戶端,它使用上面代碼發送的數據。 做到這一點的代碼是:

BufferedImage image = ImageIO.read(socket.getInputStream()); 
JLabel label = new JLabel(new ImageIcon(image)); 
f.getContentPane().add(label); 

現在的問題是,什麼是錯的這個代碼,我怎樣才能使這項工作?

+0

不是一個答案:你爲什麼不只是使用VNC?它基本上是一個沒有NAT遍歷的Teamviewer(所以如果你想要自己的TW,你必須在那裏修改它)。但就是這樣。 UltraVNC,TightVNC等等。 – Shiki

+0

@Shiki好吧,我只是想添加其他程序沒有的其他功能。有些程序可能有一些我能想到的功能,但沒有一個可以。 – user2988879

+0

我注意到你不寫圖像的長度與插座(也許你並不需要它);其次,我建議用'BufferedOutputStream'封裝'socket.getOutputStream()'。最後,我會關閉OutputStream(並在之前刷新),關閉套接字。 –

回答

4

其實代碼看起來沒問題。這是一個完整的代碼,可以在我的機器上正常工作:

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.net.*; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

public class Server { 
    public static void main(String[] args) throws Exception { 
    BufferedImage screencapture = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 
    try (ServerSocket serv = new ServerSocket(25000)) { 
     System.out.println("waiting..."); 
     try (Socket socket = serv.accept()) { 
     System.out.println("client connected"); 
     ImageIO.write(screencapture, "jpg", socket.getOutputStream()); 
     System.out.println("sent"); 
     } 
    } 
    } 
} 

class Client { 
    public static void main(String[] args) throws Exception { 
    try(Socket socket = new Socket("localhost", 25000)){ 
     BufferedImage image = ImageIO.read(socket.getInputStream()); 
     JLabel label = new JLabel(new ImageIcon(image)); 
     JFrame f = new JFrame("vnc"); 
     f.getContentPane().add(label); 
     f.pack(); 
     f.setVisible(true); 
    } 
    } 
} 

雖然只有在您發送圖像後關閉套接字,這纔會起作用。如果你只是嘗試通過同一個套接字發送一些圖像,它將會失敗。見https://stackoverflow.com/a/6973863/211205

+0

謝謝老兄,這對我來說非常合適。必須改變一些小東西,但現在一切正常,就像我希望的那樣。 – user2988879

1

我以前曾經在此工作過,並在我的博客中發佈瞭解決方案。請訪問它以獲取完整的源代碼。還需要您的反饋。

你需要閱讀線程,套接字和圖像寫入來做到這一點。

http://javabelazy.blogspot.in/2013/10/sending-screenshot-from-client-to.html

BufferedImage screenshot = robot.createScreenCapture(new Rectangle(dimensions)); 
ImageIO.write(screenshot,"png",serverSocket.getOutputStream()); 
ImageIO.write(img, "png", new File(fileName+".png"))