совместное использование экрана с использованием Java - PullRequest
0 голосов
/ 14 мая 2018

Я нашел этот код совместного использования экрана с использованием Java. Это сторона клиента, где он получает экран.

Клиентская сторона:

    class ReceiveScreen extends Thread{
    private ObjectInputStream cObjectInputStream = null;
    private JPanel cPanel = null;
    private boolean continueLoop = true;
    InputStream oin = null;
    Image image1 = null;

    public ReceiveScreen(InputStream in,JPanel p){
        oin = in;
        cPanel = p;
        start();
    }

    public void run(){
        try{
            //Read screenshots of the client and then draw them
            while(continueLoop){
                byte[] bytes = new byte[1024*1024];
                int count = 0;
                do{
                    count+=oin.read(bytes,count,bytes.length-count);
                }while(!(count>4 && bytes[count-2]==(byte)-1 && bytes[count-1]==(byte)-39));

                image1 = ImageIO.read(new ByteArrayInputStream(bytes));
                image1 = image1.getScaledInstance(cPanel.getWidth(),cPanel.getHeight(),Image.SCALE_FAST);

                //Draw the received screenshots

                Graphics graphics = cPanel.getGraphics();
                graphics.drawImage(image1, 0, 0, cPanel.getWidth(), cPanel.getHeight(), cPanel);
            }

        } catch(IOException ex) {
            ex.printStackTrace();
        }
    }
}

Кто-нибудь может объяснить, что делает это условие?

while (! (Count> 4 && bytes [count-2] == (byte) -1 && байт [кол-1] == (байт) -39));

для просмотра Серверная сторона .

1 Ответ

0 голосов
/ 14 мая 2018
  1. Он считывает байты из сокета, пока их не станет хотя бы 4.

  2. Затем он проверяетпоследние два байта для магического числа, обозначающего конец изображения.

  3. Затем он создает объект изображения из необработанных байтов.

  4. Затем он рисует объект изображения на экране.

(и повторяет это до тех пор, пока continuteloop не будет установлен в значение false.

Вы должны изучить DeMorgan'stherom. Позволяет переписать условие

while(!(count>4 && bytes[count-2]==(byte)-1 && bytes[count-1]==(byte)-39));

совпадает с

while ( count < 4 || bytes[count-2] != (byte)-1 || bytes[count-1] != (byte)-39 );

Что делает условие более понятным.

  • четыре байта должны бытьпрочитайте
  • второй байт должен быть 0xFF
  • последний байт должен быть 0xD9

Если вы посмотрите формат спецификации изображения JPEG, вывидим, что 0xFFD9 - это «маркер JPEG», который указывает «конец потока изображения»

Итак, этот цикл эффективно считывает изображение JPEG из сокета, иотображает его до тех пор, пока для флага continuteloop не будет установлено значение false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...