我最近正在尝试创建一个程序,就像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 :(得分: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。
答案 1 :(得分: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"))