Итак, я пытаюсь создать очень простой удаленный просмотрщик, и сейчас он в основном состоит из клиента, который делает снимок экрана, отправляет его на сервер, сервер превращает его в изображение и сохраняет его как * 1001. *, а затем отображает это, а затем повторять каждые три секунды.
Все работает нормально, пока мы не доберемся до отображаемой части. Когда я первоначально загружаю программу, если я установлю в окне изображения значение 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
, создаваемый каждые три секунды, но почему не обновляется окно изображения?