#java #image #sockets #transfer
#java #изображение #розетки #передача
Вопрос:
у меня есть школьное задание, и я пытаюсь добиться передачи скриншотов с клиента на сервер с помощью java. На самом деле, я чувствую, что я довольно близок к этому, потому что он отлично работает, когда я запускаю и клиент, и сервер на одном компьютере, но, как вы знаете, мне нужно делать это с разных компьютеров. Проблема в том, что когда я попытался это сделать, изображение оказалось поврежденным. Я думаю, что что-то не так с методами чтения или записи. Не могли бы вы, пожалуйста, помочь мне?
Клиент:
InetAddress host = InetAddress.getLocalHost();
Socket socket = null;
while(true) {
try {
Robot r = new Robot();
socket = new Socket(host.getHostAddress(), 9876);
Rectangle capture = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage image = r.createScreenCapture(capture);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image,"jpg",baos);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
BufferedInputStream reader = new BufferedInputStream(bais);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
byte[] buffer = new byte[4096];
int bytesRead;
while((bytesRead = reader.read(buffer))!=-1) {
out.write(buffer, 0, bytesRead);
}
reader.close();
out.flush();
out.close();
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
Сервер:
server = new ServerSocket(port);
while(true) {
Socket socket = server.accept();
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int nRead;
byte[] buffer = new byte[4096];
while((nRead = in.read(buffer, 0, buffer.length))!= -1) {
baos.write(buffer);
}
BufferedImage image = ImageIO.read(new ByteArrayInputStream(baos.toByteArray()));
if(frame==null){
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame=new JFrame();
frame.setSize(screenSize.width, screenSize.height);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
if(frame.getHeight()!=image.getHeight() || frame.getWidth()!=image.getWidth()) {
Image resizedImage = image.getScaledInstance(frame.getWidth(), frame.getHeight(), Image.SCALE_SMOOTH);
label=new JLabel();
label.setIcon(new ImageIcon(resizedImage));
frame.getContentPane().add(label,BorderLayout.CENTER);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}else {
label=new JLabel();
label.setIcon(new ImageIcon(image));
frame.getContentPane().add(label,BorderLayout.CENTER);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}
}else {
if(frame.getHeight()!=image.getHeight() || frame.getWidth()!=image.getWidth()) {
Image resizedImage = image.getScaledInstance(frame.getWidth(), frame.getHeight(), Image.SCALE_SMOOTH);
label.setIcon(new ImageIcon(resizedImage));
}else {
label.setIcon(new ImageIcon(image));
}
}
}
Вот как это выглядит, когда я получаю изображение от клиента
Спасибо.
Комментарии:
1. Если изображение получено с другой стороны и является узнаваемым, значит, вы правильно выполнили свою часть передачи по сети. Возможными причинами потери качества могут быть: разрешение захвата, степень сжатия, если применимо, и масштабирование на стороне дисплея.
2. Если бы это работало на том же компьютере, я не вижу ничего, что могло бы вызвать проблемы с изображением на другом компьютере.
3. Я получил несколько пикселей от клиента, но они вообще не распознаются. Я также считаю, что часть передачи данных по сети правильная. Я буду пытаться записывать на диск всякий раз, когда он записывает и считывает данные в сокете.
4. Почему бы вам не показать нам, как выглядит это изображение?
5. У вас есть по крайней мере одна ошибка здесь:
baos.write(buffer);
должно бытьbaos.write(buffer, 0, nRead);