Spring 实现屏幕捕获-屏幕共享

使用服务端推送技术SSE+屏幕截屏,实现一个简单的屏幕共享功能

  • SseEmitter 实现服务端推送功能
  • java.awt.Toolkit 获取屏幕截屏

屏幕截屏

使用JDK自带工具 java.awt.Toolkit 实现屏幕截屏

/**
* 捕获屏幕,生成图片
*/
public static String capture() {// 获取屏幕大小Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();String fileName = null ;try {Robot robot = new Robot();Rectangle screenRect = new Rectangle(screenSize);// 捕获屏幕BufferedImage screenCapture = robot.createScreenCapture(screenRect);//存放位置String path = ClassUtils.getDefaultClassLoader().getResource("static").getPath();fileName = System.currentTimeMillis() + ".png" ;LOGGER.info("屏幕截屏路径:{}", path);// 把捕获到的屏幕 输出为 图片ImageIO.write(screenCapture, "png", new File(path +File.separator + fileName));} catch (Exception e) {LOGGER.error("获取屏幕截屏发生异常", e);}return fileName ;
}

服务端推送SSE

SSE( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议
SSE 是单向通道,只能服务器向客户端发送消息

方式一:自己拼接返回参数值

// 服务端推送 返回结果必须以 data: 开始
public static final String SSE_RETURN_START = "data:" ;// // 服务端推送 返回结果必须以 \n\n 结束
public static final String SSE_RETURN_END = "\n\n" ;// 服务端推送SSE技术 内容格式必须是  text/event-stream
@GetMapping(value = {"","/"}, produces = "text/event-stream;charset=UTF-8")
public String index() {String capture = CaptureScreenUtils.capture();// 返回的内容 必须以 data: 开头,以 \n\n 结尾,不然前端JS处始终不会进入到 onmessage 方法内return SSE_RETURN_START + capture + SSE_RETURN_END ;
}

方式二:使用Spring MVC已经封装的对象SseEmitter 来实现

@GetMapping("/index")
public SseEmitter sse() {// 获取屏幕截图,每个1秒获取一次,返回前端界面进行图片展示String capture = CaptureScreenUtils.capture();SseEmitter emitter = new SseEmitter(1L) ;try {emitter.send(SseEmitter.event().reconnectTime(1).data(capture));} catch (IOException e) {LOGGER.error("服务端推送服务发生异常", e);}return emitter;
}

实际是封装的内部拼接的头尾

// org.springframework.web.servlet.mvc.method.annotation.SseEmitter.SseEventBuilderImpl@Override
public SseEventBuilder data(Object object, @Nullable MediaType mediaType) {append("data:");saveAppendedText();this.dataToSend.add(new DataWithMediaType(object, mediaType));append("\n");return this;
}

前端界面JS

请求sse连接

var source = new EventSource("/sse/index");
source.onmessage = function(event){console.log('onmessage');console.log(event.data);document.getElementById('captureImgId').src = event.data;
};

若是出现 java.awt.HeadlessException: null 报错

则需要在启动类里加上如下代码:

System.setProperty("java.awt.headless", "false");

启动类:CaptureScreenApplication

package com.tianya.springboot.capture;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class CaptureScreenApplication {public static void main(String[] args) {// 解决HeadlessException 异常问题System.setProperty("java.awt.headless", "false");SpringApplication.run(CaptureScreenApplication.class, args); }}

界面访问:http://localhost:8080/ 展示效果

项目结构

简单记录学习服务端推送技术SSE及Java获取屏幕截屏技术的过程
好记性不如烂笔头

具体完整的项目:GitHub 项目完整地址- spring-boot-learn 下的 spring-boot-learn-capture-screen

若是有任何帮助到的,请给个star,多谢!!!

Spring 实现屏幕捕获-屏幕共享相关推荐

  1. java robot 控制 不用用户 界面_编写一个基于Java Robot类的屏幕捕获工具

    Fun and Games(娱乐和游戏)提供了通过Java的Robot类捕获主屏幕设备的功能,并且可以将整个屏幕或者选定的一部分保存为jpeg文件.这篇文章以Swing应用的形式实现了屏幕捕获工具. ...

  2. VC++ 屏幕捕获(DirectDraw)

    1.初始化DirectDraw接口 #include <ddraw.h> LPDIRECTDRAW m_lpDDraw; LPDIRECTDRAWSURFACE m_lpDDSPrime; ...

  3. MindMapper屏幕捕获功能该如何使用

    MindMapper屏幕捕获功能可以让您创建主题时事半功倍,截取的图片可以作为分支添加到导图中,大大的节省添加图片的操作.下面,小编就这个功能,和大家共享运用时的一些小秘诀. 在MindMapper中 ...

  4. ScreenCapture:通过DirectX 库进行屏幕捕获

    具有音频混合功能的 DirectX 硬件屏幕捕获和编码. H264/H265/VP80/VP90/FLAC/MP3. 以硬件方式捕获视频和屏幕截图. 介绍 有很多关于它的东西. 这是一个简单的单头文件 ...

  5. Bytescout屏幕捕获,SDK ActiveX的主要功能

    Bytescout屏幕捕获,SDK ActiveX的主要功能 如果您构建的应用程序旨在将屏幕动作记录到WMV,AVI电影文件中,请利用Bytescout屏幕捕捉SDK向您的程序快速添加显示视频记录功能 ...

  6. VC++屏幕捕获并保存成图片(附源码)

    目录 1.屏幕捕获(截取桌面) 2.将内存中的位图保存成图片文件 3.完整功能的屏幕截图

  7. spring代码异常捕获到logback logging.config=logback-spring.xml文件中不能输出异常e.printStackTrace...

    在spring中使用logging.config=logback-spring.xml将日志转存到了文件中.但是代码中的捕获的异常无法用 e.printStackTrace 打印到文件中.使用如下方法 ...

  8. Spring 全局异常捕获

    引言 前后端分离开发,后台有时候会出现不可预知的异常(运行时异常),在实际生产中通常需要统一返回符合一定响应结构的异常信息给前端,这一方面可以避免用户看到后台的报错信息,一方面也是保护后端程序免受恶意 ...

  9. SpringBoot精通系列-如何封装Spring Boot异常捕获

    导语   在Spring Boot开发过程中,不难避免的就是异常处理,有些异常是通过try catch方式捕获,或者是通过Throw直接抛出,但是这种方式的话对于客户端是不友好的,所以希望是通过编码的 ...

最新文章

  1. Android 控件学习--自定义SeekBar
  2. Flex 容器基本概念
  3. petshop 出现没有为 SQL 缓存通知启用数据库“MSPetShop4”
  4. VirtualBox虚拟机Ubuntu设置共享文件夹
  5. Exchange 2010 Mailtip 功能
  6. 蓝桥杯 每周一练 第一周(3n+1问题)
  7. C++ primer 11章关联容器
  8. 阅面携手英特尔发布“繁星”系列产品,推动机器视觉迈入AI芯片新纪元
  9. js调用打印机直接打印_打印机如何打印二维码
  10. 我的记事本(VB6)
  11. WPS Office 免费版和专业增强版区别是什么
  12. 质性数据分析软件NVivo的编码比较查询
  13. 二阶魔方万能还原公式_魔方小站二阶魔方速拧《2阶魔方公式 视频教程》
  14. Vue项目上线的基本流程
  15. Google Earth Engine(GEE)基于哨兵数据计算植被覆盖度—以宁夏为例
  16. php 回车符替换,php怎么替换回车符
  17. “开源和商业化不能形成对立!”
  18. PADS中常用无模命令快捷键
  19. 自动化办公 | 快速从Excel中提取图片并匹配命名
  20. C语言绕过杀毒软件,易语言插件规避杀毒软件方法

热门文章

  1. 旋转矩阵(侧重推理)
  2. 基于改进FCOS的钢带表面缺陷检测算法
  3. bpmn基础使用(一)
  4. cc2430/cc2530驱动安装不正确
  5. matlab布林线代码,精品布林线主图指标 源码 通达信
  6. Unity 2D塔防
  7. .bat文件运行方式
  8. 解决 Uncaught TypeError: elem.getClientRects is not a function
  9. 四个关键词解读08下半场
  10. 【系统】查看文件的md5值