使用java进行屏幕共享

时间:2018-05-14 14:38:10

标签: java swing screensharing

我发现这个屏幕使用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] ==(字节)1-39));

查看Server side

1 个答案:

答案 0 :(得分:2)

  1. 它从套接字中读取字节,直到它们中至少有4个。

  2. 然后检查最后两个字节是否有幻数,表示图像的结尾。

  3. 然后它从原始字节创建图像对象。

  4. 然后它将图像对象绘制到屏幕上。

  5. (并且不断重复此操作,直到shared_ptr设置为false。

    你应该学习DeMorgan的热情。它允许重写条件

    continuteloop

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

    这使情况更加清晰。

    • 必须读取四个字节
    • 第二个到最后一个字节必须是0xFF
    • 最后一个字节必须是0xD9

    如果你查看JPEG图像规范格式,你会发现0xFFD9是一个" JPEG标记"表示图像流的结束"

    因此,此循环有效地从套接字读取JPEG图像并显示它,直到while ( count < 4 || bytes[count-2] != (byte)-1 || bytes[count-1] != (byte)-39 ); 标志设置为false。