2013-12-12 184 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"))