百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

springboot 2整合websocket推送消息、数据流、解析pdf图片并压缩

ztj100 2025-01-19 02:00 16 浏览 0 评论

springboot 2.4.6整合websocket

gitee地址:https://gitee.com/wyait/spring-boot-websocket.git

spring-boot-websocket : springboot整合websocket实现简版聊天室、上传文件、推流文件到客户端、解析pdf文件为图片,并进行图片压缩

github地址:https://github.com/wyait/springboot-websocket.git


本文需要一定的java、springboot技术基础。

这里只是阐述说明,实际效果需要结合源码进行理解。

整合websocket实现推送数据(消息、图片)流

什么是webSocket?

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,

然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

websocket特点

  • 1.建立在 TCP 协议之上,服务器端的实现比较容易。
  • 2.与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
  • 3.数据格式比较轻量,性能开销小,通信高效。
  • 4.可以发送文本,也可以发送二进制数据。
  • 5.没有同源限制,客户端可以与任意服务器通信。
  • 6.协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

相关api,todo

场景

前后端分离项目,业务员在后台PC操作的图片切换,前端客户端页面可以动态展示。考虑通过websocket建立通讯通道,实现服务器端主动推送文件流给前端,实现动态图片文件展示。

websocket适用场景:

  • 聊天
  • 多用户(协同)编辑
  • 服务端推送数据流到客户端
  • 音视频聊天 / 视频会议 / 在线教育:用WebSockets getUserMedia API和HTML5音视频元素是个不错的选择。WebRTC的出现顺理成章的成为刚才概括的组合体,它看起来很有希望,但其缺乏目前浏览器的支持。

相关技术

  • springboot 2.4.6
  • websocket
  • jdk1.8
  • fastjson 1.2.79 (注意:有版本兼容性问题)

demo测试访问地址

  • 本地聊天室访问地址: http://127.0.0.1:8033/websocketDemo.html
  • 通过websocket主动推流图片到前端,动态切换图片接口地址:http://127.0.0.1:8033/ppt/change/1/5
  • pdf解析为图片访问地址:http://127.0.0.1:8033/pdf.html

动态切换图片,主动推送数据流接口示例

http://127.0.0.1:8033/ppt/change/{sid}/{fileName}

sid:不同用户(demo只是区分了1和其他),对应查看的图片内容不一样

fileName:分享图片的名称(注意,本地是加载指定路径下的图片文件,跑demo的时候,要提前准备好)

创建springboot项目并集成websocket


项目相关代码,详见源码,这里就不赘述。

WebSocketServer

我们需要实现它的三个方法:OnOpen,OnClose,OnMessage

他们都会自动调用,类似于事件触发,含义分别是,连接建立成功时调用的方法,连接关闭时调用的方法,最后一个是接收客户端发来的消息

其中OnMessage我们后面会使用多种实现,支持数据、二进制数据流。


使用websocket实现文件上传功能

我们仿造刚才的

WebSocketServer

在写一个websocket类

还是在web包下建立一个类,类名为

WebSocketUploadServer

可以将原来WebSocketServer的代码复制过来,然后稍微改造一下,其实我们实现文件上传也可以直接在原来WebSocketServer的代码里直接实现。

原本聊天室的情况下,一个房间里是可以有多个客户端连接的,但是文件上传我们是不允许的,假如有多个人在同一个房间,那么消息就会传到每个客户端,因为我们要做分块上传,所以这里控制每个房间只能有一个人。

我们把websocketDemo.html也复制一份,改名就叫

uploadFileDemo.html

我们原先的房间号是手动输入的,现在,我们保证每次都是不同的房间号所以,这次房间号就用随机数。

当然方法有很多种,我只是提供一种简单的实现方式,不同的业务场景当然也需要不同的实现方式。

后台的核心代码主要是接收字节流和json消息,我们将字符串消息格式化成了json消息。

1,接收字符串:public void onMessage(String message, Session session) {}

2,接收字节流:public void onMessage(byte[] message, Session session) {}

业务逻辑我们放在了service层进行处理

在websocketupload包下建立service包

然后建立SaveFileI接口,接口里有两个方法,一个是创建文件路径的,一个是将流数据写入文件。

我们在websocket服务里注入接口的时候要注意一点,因为spring是单例的,websocket在初始化的时候就实例化了spring的bean,但是当websocket创建一个新的连接的时候spring的bean会出现null的问题(static静态注入问题),也就是它只注入了一次。解决方案详见代码,或组合使用@PostConstruct注解解决。

最后返回的这个文件地址,项目中指定本地目录下。

websocket推送图片流到前端

1,聊天页面websocketDemo.html新增图片img标签,用于展示推送的图片显示。

2,service层新增websocket推送二进制数据流到前端,WebsocketServer.sendPic()。

3,后台新增动态切换图片接口PptImgController(service层调用websocket推送二进制数据流到前端方法)。

4,本地指定文件路径WebsocketServer.sendPic().filePath下,放置测试图片文件(命名要和接口3中的一致)。

详见代码。

新增上传PPT文件,每页生成单独的图片

//todo 图片超出制定大小,进行压缩处理。

方案一 使用pdfbox插件【推荐】

上传pdf文件,转为图片保存,并生成图片地址。

1,引入依赖:

<!--   springboot parent版本2.4.6 -->
<!--   pdfbox 用于将pdf转为字节码数组 -->
    <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.23</version>
        </dependency>

<!--   Hutool工具类:用于将文件字节数据保存为图片,到指定目录 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.8</version>
        </dependency>

2,接口入口PdfToImgController 请求示例:/pdf/to/image

3,pdf转图片工具类PdfToImageUtils

4,页面请求地址:http://127.0.0.1:8033/pdf.html

保存图片位置,PdfToImageUtils.IMG_PATH,demo路径为:D:\\data\\images\\pdf\\ (可自定义)

无中文乱码问题。

方案二 使用icepdf插件【不推荐】

详见源码:ImageUtils类,

遗留问题:在解析pdf时,应用服务所在的系统环境中,如果存在不支持的字体,就会出现中文乱码,需要额外在系统环境中安装字体。

其他方案

itextpdf插件

等比压缩图片功能

详见:PdfToImageUtils.compressPic()方法

相关推荐

从IDEA开始,迈进GO语言之门(idea got)

前言笔者在学习GO语言编程的时候,GO语言在国内还没有像JAVA/Php/Python那样普及,绕了不少的弯路,要开始入门学习一门编程语言,最好就先从选择一个好的编程语言的开发环境开始,有了这个开发环...

基于SpringBoot+MyBatis的私人影院java网上购票jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于SpringBoot...

基于springboot的个人服装管理系统java网上商城jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...

基于springboot的美食网站Java食品销售jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...

贸易管理进销存springboot云管货管账分析java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目描述贸易管理进销存spring...

SpringBoot+VUE员工信息管理系统Java人员管理jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍SpringBoot+V...

目前见过最牛的一个SpringBoot商城项目(附源码)还有人没用过吗

帮粉丝找了一个基于SpringBoot的天猫商城项目,快速部署运行,所用技术:MySQL,Druid,Log4j2,Maven,Echarts,Bootstrap...免费给大家分享出来前台演示...

SpringBoot+Mysql实现的手机商城附带源码演示导入视频

今天为大家带来的是基于SpringBoot+JPA+Thymeleaf框架的手机商城管理系统,商城系统分为前台和后台、前台用的是Bootstrap框架后台用的是SpringBoot+JPA都是现在主...

全网首发!马士兵内部共享—1658页《Java面试突击核心讲》

又是一年一度的“金九银十”秋招大热门,为助力广大程序员朋友“面试造火箭”,小编今天给大家分享的便是这份马士兵内部的面试神技——1658页《Java面试突击核心讲》!...

SpringBoot数据库操作的应用(springboot与数据库交互)

1.JDBC+HikariDataSource...

SpringBoot 整合 Flink 实时同步 MySQL

1、需求在Flink发布SpringBoot打包的jar包能够实时同步MySQL表,做到原表进行新增、修改、删除的时候目标表都能对应同步。...

SpringBoot + Mybatis + Shiro + mysql + redis智能平台源码分享

后端技术栈基于SpringBoot+Mybatis+Shiro+mysql+redis构建的智慧云智能教育平台基于数据驱动视图的理念封装element-ui,即使没有vue的使...

Springboot+Mysql舞蹈课程在线预约系统源码附带视频运行教程

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的Springboot+Mysql舞蹈课程在线预约系统,系统项目源代码在【猿来入此】获取!https://www.yuan...

SpringBoot+Mysql在线众筹系统源码+讲解视频+开发文档(参考论文

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的在线众筹管理系统,主要实现了普通用户在线参与众筹基本操作流程的全部功能,系统分普通用户、超级管理员等角色,除基础脚手架外...

Docker一键部署 SpringBoot 应用的方法,贼快贼好用

这两天发现个Gradle插件,支持一键打包、推送Docker镜像。今天我们来讲讲这个插件,希望对大家有所帮助!GradleDockerPlugin简介...

取消回复欢迎 发表评论: