Передача изображений с помощью сокета Java

#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);