java通过udp实现屏幕监控

闲来无事 ,实现了一个几年前的想法 屏幕监控,使用udp传输 ,udp传输的大小有限制

通过优化实现了屏幕监控

 


import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import org.junit.Test;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Date;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

public class UdpTest {

    private byte[] copy(byte[] a, byte[] b) {
        byte[] c = new byte[a.length + b.length];
        System.arraycopy(a, 0, c, 0, a.length);
        System.arraycopy(b, 0, c, a.length, b.length);
        return c;
    }

    private boolean startWith(byte[] aa, byte[] start) {
        for (int i = 0; i < start.length; i++) {
            if (i > aa.length - 1) {
                return false;
            }
            if (aa[i] != start[i]) {
                return false;
            }
        }
        return true;
    }

    private byte[] captureScreen() throws AWTException, IOException {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Rectangle screenRectangle = new Rectangle(screenSize);
        Robot robot = new Robot();
        BufferedImage image = robot.createScreenCapture(screenRectangle);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ImageIO.write(image, "png", bos);
        return bos.toByteArray();
    }

    /**
     * 客户端发送
     * @throws IOException
     */
    @Test
    public void client() throws IOException {
        java.util.Timer qTimer = new java.util.Timer();
        qTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    byte[] bytes = captureScreen();
                    send(bytes);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }, new Date(), 500);
        System.in.read();
    }

    @Test
    public void sendFile() throws Exception {
        byte[] data = FileUtil.readBytes("D:\\aa.jpg");
        send(data);
    }

    public void send(byte[] data) throws Exception {

        //   byte[] data = FileUtil.readBytes("C:\\Users\\DELL\\Pictures\\bb.jpeg");
        //   byte[] data = FileUtil.readBytes("C:\\Users\\DELL\\Pictures\\timg.jpg");

        byte[] header = new byte[100];
        String obj = "length:" + data.length + ":end";
        System.out.println("all:" + obj);
        byte[] bytes = obj.getBytes();
        System.arraycopy(bytes, 0, header, 0, bytes.length);
        byte[] copy = copy(header, data);

        DatagramSocket datagramSocket = new DatagramSocket();

        int ced = 0;
        byte[] c = new byte[50 * 1024];
        while (true) {

            int sy = copy.length - ced;
            if (sy <= 0) {
                break;
            }
            int min = Math.min(sy, c.length);
            System.arraycopy(copy, ced, c, 0, min);
            DatagramPacket dataGramPacket = new DatagramPacket(c, min, InetAddress.getByName("127.0.0.1"), 9999);
            datagramSocket.send(dataGramPacket);
            ced += min;
            System.out.println("send" + ced);
            TimeUnit.MICROSECONDS.sleep(1); //限制传输速度 不然容易丢包
        }
    }


    /**
     * 服务端接收
     * @throws Exception
     */
    @Test
    public void receive() throws Exception {

        byte[] header = "length".getBytes();

        byte[] bs = new byte[1024 * 1024];
        DatagramPacket dp = new DatagramPacket(bs, bs.length);
        DatagramSocket datagramSocket = new DatagramSocket(9999);


        JFrame frame = new JFrame("title");
        frame.setMinimumSize(new Dimension(500, 500));
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ByteArrayOutputStream bao = new ByteArrayOutputStream();

        int ed = 0;
        boolean x = false;
        int len = 0;
        while (true) {
            datagramSocket.receive(dp);
            boolean b = startWith(dp.getData(), header);
            if (!x) {
                String s = new String(dp.getData(), 0, 100);
                String s1 = StrUtil.subBetween(s, "length:", ":end");
                System.out.println("sss+" + s1);
                len = Integer.parseInt(s1);
                x = true;
            }
            if (x) {
                if (ed == 0) {
                    int len1 = dp.getLength() - 100;
                    bao.write(dp.getData(), 100, len1);
                    ed += len1;
                } else {
                    bao.write(dp.getData(), 0, dp.getLength());
                    ed += dp.getLength();
                }

            } else {
                System.out.println("not-length");
            }
            if (bao.size() >= len) {
                showImg(bao.toByteArray(), frame);
                bao.reset();
                x = false;
                ed = 0;
            }


            System.out.println("bbbb" + dp.getLength());

        }
    }


    ImageLabel label = null;

    public void showImg(byte[] bytes, JFrame frame) throws IOException {
        ByteArrayInputStream in = new ByteArrayInputStream(bytes);    //将b作为输入流;
        BufferedImage image = null;
        try {
            image = ImageIO.read(in);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
//        Image scaledInstance = image.getScaledInstance(800, 500, Image.SCALE_SMOOTH);
         ImageIcon icon = new ImageIcon(image);
        if (label != null) {
            label.setIcon(icon);

        } else {


            label = new ImageLabel(icon);

            label.setLocation(0, 0);
            frame.getContentPane().add(label);
            label.validate();
        }
        label.validate();
        frame.validate(); //动态添加或者删除某些控件后,为了实时展现操作后的结果
        //Frame.pack();//这个方法的作用就是:根据窗口里面的布局及组件的preferedSize来确定frame的最佳大小。
    }

    public static class ImageLabel extends JLabel {

        public ImageLabel(ImageIcon icon) {
            setSize(icon.getImage().getWidth(null),
                    icon.getImage().getHeight(null));
            setIcon(icon);
            setIconTextGap(0);
            setBorder(null);
            setText(null);
            setOpaque(false);
        }

    }
}

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于JAVA CS远程监控系统软件的实现(源代码+WORD论文文档论文) 基于JAVA C/S远程监控系统软件的实现 摘 要 近年来,网络技术的不断发展,为远程监控技术的发展创造了条件。远程监控系统软件越来越受到人们的重视,其实用性也毋庸质疑。基于JAVA C/S远程监控系统软件突破了空间的限制,使用者不用亲临,在自己的电脑面前就能轻松的实现对被监控端机器的监控。本系统采用Java网络编程和Java图形编程实现。笔者在开发过程中将网络技术与远程监控理论基础相结合,实现了以下功能:能连续获得被监控端机器屏幕变化;实现监控端硬盘文件的上传、下载;实现对鼠标、键盘的模拟;实现在远程机器上执行任意DOS命令;远程关机、远程重启计算机,方便了用户监视和操作被监控端机器。本系统从系统需求分析、概要设计、详细设计到具体的编码实现和后期的代码优化、功能测试都严格遵循了软件工程的思想。 关键词:远程监控Java Robot;屏幕截取;Java Socket 系统需求分析及理论基础 2.1 系统需求分析 2.1.1 系统功能需求 1.连续获得被控端机器屏幕变化。 2.实现被控端硬盘文件的上传、下载。 3.实现对鼠标、键盘的模拟。 4.实现在被控端机器上执行任意DOS命令。 5.远程关机、远程重启计算机。 2.1.2 其他需求 1.系统实用,界面操作简便。 2.被监控端自动隐藏运行。 被监控端将随电脑启动而自动运行,运行时默认无任何可见界面。 2.2 系统开发原理及关键技术 2.2.1 系统开发原理 本系统是利用类java.awt.robot中的屏幕截取和鼠标、键盘自动控制功能,然后加上网络传输功能来完成来完成截屏和远程控制的。 2.2.2 系统运行概述 1.启动被监控端,打开指定的UDP端口号。用于读取命令。 2.被监控端读取命令(命令格式为ordername:port)ordername为命令名字,port为主控端打开的TCP端口。 3.接到主控端连接后,被监控端就对当前用户的桌面采用屏幕截取,然后发送给主控端。依被监控端设计的不同,可以设定屏幕截取的时间间隔,时间间隔短一点就可以获得连续屏幕变化了。 4.主控端在画布上对鼠标、键盘事件进行监听,被监控端重演主控端上的事件 5.主控端和被监控端读取和发送数据,分别来实现文件上传和下载。 6.在被监控实现DOS命令的执行。 2.2.3 系统的关键技术 系统使用的关键技术就是Java网络编程和Java图形编程。用Java网络编程实现主控端和被监控端的通讯(命令收发、数据传送),用Java图形编程完成主控端控制界面的编写。具体应用如下: 1.实现主控端(服务器)与被监控端(客户端)之间的通讯。 ——用Java Socket来实现。 2.用Java采集事件,封装成消息,用于发送。 ——在主控端机器上采集事件(一般只不过是键盘和鼠标的事件),然后封装成消息类传输到被监控端。 3.在被监控端上重演主控端的动作事件。 ——在被监控端运行client端,接收消息,如果主控端有请求操作的消息,用Robot截下当前屏幕,传给主控端,主控端显示被监控端的屏幕,是一个位图;然后接收在这个位图上的鼠标事件和键盘事件,并把鼠标位置(位图上的坐标换算成对应的屏幕上的坐标)和键值送到被监控端上,在被监控端上重演同样的事件。 2.3 系统的开发平台 JDK1.5.0,Eclipse3.1,Windows XP Professional 2.3.1 Eclipse介绍 Eclipse是一种可扩展的开放源代码IDE。2001年11月,IBM公司捐出价值4,000万美元的源代码组建了Eclipse联盟,并由该联盟负责这种工具的后续开发。集成开发环境(IDE)经常将其应用范围限定在“开发、构建和调试”的周期之中。为了帮助集成开发环境 (IDE)克服目前的局限性,业界厂商合作创建了Eclipse平台。Eclipse允许在同一IDE中集成来自不同供应商的工具,并实现了工具之间的互操作性,从而显著改

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值