原理:通过Robot截图,压缩成jpg格式,然后通过websocket发送给前端。

前端显示图像,发送鼠标事件,实现对远程电脑的控制。

再某些情况下,可以用来实现远程控制,目前只是一个雏形。

后端核心代码

/**
 * 屏幕采集与鼠标控制
 * @author qujia
 *
 */
@Component
public class ScreenCapture {
    
    Robot robot ;//采集屏幕
    Rectangle screenRectangle;//屏幕区域
    public BufferedImage doCapture()
    {
        if(robot==null)this.init();        
        BufferedImage image = robot.createScreenCapture(screenRectangle);  //采集图像     
        return image;

}
    
    /**
     * 
     * @param x
     * @param y
     */
    public void click(int x,int y) {
        
        if(robot==null)this.init();

try {
            robot.mouseMove(x, y);//移动到目标点
            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);//点击
            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);//松开
        }
        catch (Exception e) {
            // TODO: handle exception
        }
        
    }
    //初始化
    private void init()
    {
        
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕大小
        screenRectangle = new Rectangle(screenSize);//采集区域
        try {
            robot = new Robot();
        }
        catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

/**
 * 采集主线程
 * @author qujia
 *
 **/
@Component
public class CaptureThread  {
    private static final Logger LOG = LoggerFactory.getLogger(CaptureThread.class);
    @Autowired
    ScreenCapture screenCapture;//图片采集对象
    
    Thread thread;
    boolean isrun;
    /**
     * 开始采集线程
     */
    public void start() {
        stop();
        ClientService.screenCapture=screenCapture;//存储采集对象
        thread=new Thread(task);
        thread.start();
        isrun=true;
        
    }
    /**
     * 停止线程
     */
    public void stop() {
        if(thread!=null) {
            thread.interrupt();        
        }
        isrun=false;
    }
    /**
     * 采集主线程
     */
    Runnable task=new Runnable() {        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (isrun) {
                try {
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();//内存文件
                    BufferedImage img=screenCapture.doCapture();//采集图像                    
                    ImageIO.write(img, "jpg", baos);//写入内存文件
                    ByteBuffer data=ByteBuffer.wrap(baos.toByteArray());//数据准备
                    ClientService.sendDataALL(data);//发送到页面
                    Thread.sleep(100);//休息一下
                }
                catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
                
            }
        }
    };
    
}

由于springboot默认将headless设置为true,因此启动的时候需要特别设置headless为false

headless意思就是不需要桌面相关功能,这个项目用到了桌面,所以要设置一下

//启动的时候必须吧headless设置为false
        SpringApplicationBuilder builder=new SpringApplicationBuilder(ScreenApp.class);
        builder.headless(false).run(args);

前端代码,比较简单,创建websocket,然后收图片,发控制数据

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"></meta>
        <title>远程桌面显示</title>
        <script type="text/javascript">    
                var ws;
                function initWS(){
                    
                    if ("WebSocket" in window)
                    {                        
                        ws=new WebSocket("ws://服务器地址/client/web");
                        ws.onmessage = function (evt) 
                        { 
                       
                            const imageUrl = (window.URL || window.webkitURL).createObjectURL(evt.data);//图片地址
                            img.src=imageUrl;
                        };
                    }
                    else{
                        alert('浏览器不支持webscoket');
                    }
                }
                var img;
                window.onload = function(){
                    img=document.getElementById('img');
                    img.οnmοusemοve=msmove;
                    img.οnclick=msclick;
                    initWS();//初始化webscoket
                }
                function msclick(e){
                    console.log(e.clientX,e.clientY);
                    var x=parseInt(1.0*e.clientX/img.width*img.naturalWidth);
                    var y=parseInt(1.0*e.clientY/img.height*img.naturalHeight);
                    console.log(x,y)
                    var d='{"ac":"ck","x":"'+x+'","y":"'+y+'"}'
                    ws.send(d);
                }
                
                function msmove(e){
                    //console.log(e);
                    var d='{"ac":"mv","x":"+x+","y":"+y+"}'
                    //ws.send(d);
                }
        </script>
        <style>
        *{padding:0;margin:0;}
        img{ width:100%; height:100%;}
        </style>
    </head>
    <body>
    <img id="img" />
    </body>
</html>

使用springboot实现远程控制相关推荐

  1. rabbitmq和springboot实现智能家居远程控制

    一.什么是mqtt协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的&qu ...

  2. SpringBoot Admin2.0 集成 Java 诊断神器 Arthas 实践

    作者 | sparrow 来源 | 阿里巴巴云原生公众号 本文来自 Arthas 2021 年 3 月征文投稿,4 月有奖征文参与方式可见文末. 项目最初使用 Arthas 主要有两个目的: 通过 a ...

  3. SpringBoot部署项目到Docker仓库

    SpringBoot部署项目到Docker仓库 1.开启远程控制端口 Centos7开启方式: vim /lib/systemd/system/docker.service 找到ExecStart行 ...

  4. SpringBoot开源项目(企业信息化基础平台)

    JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...

  5. 如何利用springboot快速搭建一个消息推送系统

    最近在完善毕设的路上,由于是设计一个远程控制物联网系统,所以服务端到硬件我选用了MQTT协议.因为MQTT的发布/订阅模式很适合这种场景.接下来就来聊聊遇到的一些问题以及解决思路吧. 毕设技术栈:sp ...

  6. 基于Springboot+Vue2前后端分离框架的智慧校园系统源码,智慧学校源码+微信小程序+人脸电子班牌

    ▶ 智慧校园开发环境: 1.使用springboot框架Java+vue2 2.数据库MySQL5.7 3.移动端小程序使用小程序原生语音开发 4.电子班牌固件安卓7.1:使用Java Android ...

  7. 基于 SpringBoot + Vue 实现的物联网/智能家居系统

    简介 物美智能是一套开源的软硬件系统,可用于二次开发和学习,快速搭建自己的物联网/智能家居系统.硬件工程师可以把自己的设备集成到系统:软件工程师可以使用项目中的设备熟悉软硬件交互. 项目架构 服务端使 ...

  8. 基于springboot+vue+element-ui开发的大型智慧校园电子班牌系统源码

    Java智慧校园系统源码 智慧学校源码 小程序+电子班牌 开发环境:Java+springboot+vue+element-ui+mysql 有演示,可正常上手项目+正版授权. 智慧校园云平台实现了智 ...

  9. java录音机_GitHub - wylGeorge/RuphyRecorder: 基于Java的录音机(使用基于Rest API的页面操作,方便远程控制)...

    RuphyRecorder 配置文件src/main/resources/application.properties server.port=8080 download.passwd=123... ...

  10. Springboot+Netty实现基于天翼物联网平台CTWing(AIOT)终端TCP协议(透传模式)-应用订阅端(北向应用)

    之前实现了使用Springboot+Netty基于天翼物联网平台CTWing(AIOT)终端TCP协议(透传模式)-设备终端(南向设备),模拟设备发送的数据给到了AIOT平台,那么在第三方应用也需要去 ...

最新文章

  1. 成人高考报计算机还是学前教育,成人高考读什么专业比较好 三大热门专业
  2. 昨天在公司加班,上午好像就是弄一个ftp的linux服务问题
  3. SpringCloud Greenwich(七)集成dubbo先启动消费者(check=false),然后启动提供者无法自动发现注册
  4. [导入]在C++ Builder3下实现程序自动运行的方法
  5. Python-100 | 练习题 01 列表推导式
  6. 开发经验分享_04_快速熟悉程序(思路)
  7. PTA-7-5 打印杨辉三角 (20分)(C语言)
  8. 软件测试之手动测试存在的重要原因
  9. 个人名片+微信名片二维码 VUE
  10. poj:2455 Secret Milking Machine 秘密挤奶机(二分+最大流)
  11. 创新实训(11)——推荐系统实现之基于流行度和新鲜度的推荐
  12. 计算机神经网络sci,神经网络方向sci期刊
  13. Gradle | Gradle构建之Groovy语言基础
  14. STM32F4的LED点灯
  15. 《李焕英》爆火背后,世界正在奖励那些诚实的人
  16. 基于坐标变换与随机Hough 变换的抛物线运动目标检测算法
  17. web 前后台数据交互的方式
  18. 2345浏览器如何显示浏览器推送内容
  19. ENVI5.3 影像数据辐射定标及大气校正实验处理-多光谱遥感数据
  20. JVM原理和调优的理解和学习

热门文章

  1. bada千字文应用程序简介
  2. wx ipad协议
  3. 高质量web前端后台模板
  4. qpushbutton设置居中_在右侧对齐图标并将文本居中放置在QPushButton中
  5. 深圳礼品展1688再度强强联手,30万平超级大展10月震撼来袭!
  6. 业务关键路径最小成本试错《精益创业》
  7. 软件渗透测试:定义、需求、过程
  8. 第9课:利用 Headers 的 Cookie 和 User-agent 伪装自己
  9. 【Unity】插件TextAnimator 新手使用说明
  10. 【emmm】快速算三角形角度