【发布时间】:2018-11-07 17:50:22
【问题描述】:
所以,我正在尝试创建一个非常简单的远程查看器,现在它基本上由一个客户端组成,该客户端截取屏幕截图,将其发送到服务器,服务器将其转换为图像并将其保存为 @987654321 @,然后显示它,然后每三秒重复一次。
一切正常,直到我们到达显示部分。当我最初加载程序时,如果我将图像框设置为显示image.jpg,它就可以工作(只要image.jpg 已经存在——也就是程序运行了不止一次)。但是,当我尝试通过我的Runnable 设置/更新它时,它不起作用。
注意: 项在您将它们放入 Runnables 时会更新,所以这显然不是问题。
这是服务器代码(接收图像的字节数组):
Thread thread = new Thread(new Runnable() {
public void run() {
while (true) {
try {
// Get client and receive byte array
ServerSocket server = new ServerSocket(2282);
Socket socket = server.accept();
DataInputStream inputData = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
// Read bytes to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buffer[] = new byte[1024];
for (int s; (s = inputData.read(buffer)) != -1;) {
baos.write(buffer, 0, s);
}
byte result[] = baos.toByteArray();
// Create bufferedImage from byte array
BufferedImage bufferedImage = null;
ByteArrayInputStream bais = new ByteArrayInputStream(result);
bufferedImage = ImageIO.read(bais);
// Save image
File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);
// Update image box
BufferedImage imageIcon = ImageIO.read(new File("image.jpg"));
BufferedImage resizedImage = resize(imageIcon, 440, 820); // Resizes image with parameters of (BufferedImage img, int height, int width)
imageBox = new JLabel(new ImageIcon(resizedImage));
imageBox.setBounds(10, 11, 826, 446);
frame.getContentPane().add(imageBox);
// Close everything
server.close();
socket.close();
inputData.close();
baos.close();
bais.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
});
thread.start();
虽然我非常怀疑客户有什么问题,但如果您需要,我也提供了;
while (true) {
System.out.println("started");
// Capture the image
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = robot.createScreenCapture(screenRect);
// Convert the image to a byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(capture, "jpg", baos);
byte[] bytes = baos.toByteArray();
// Send byte array over socket connection
Socket socket = new Socket("CamdensProgrammingDesktop", 2282);
DataOutputStream outputData = new DataOutputStream(socket.getOutputStream());
outputData.write(bytes);
socket.close();
outputData.close();
TimeUnit.SECONDS.sleep(3);
}
因此,如果您运行该代码,您应该每三秒就会创建一个 image.jpg,但为什么图像框不会更新?
【问题讨论】:
-
答案进一步编辑,现在带有工作代码示例。再次,请询问是否有任何不清楚的地方。
标签: java arrays swing sockets bufferedimage