springboot 2整合websocket推送消息、数据流、解析pdf图片并压缩
ztj100 2025-01-19 02:00 36 浏览 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()方法
相关推荐
- 30天学会Python编程:16. Python常用标准库使用教程
-
16.1collections模块16.1.1高级数据结构16.1.2示例...
- 强烈推荐!Python 这个宝藏库 re 正则匹配
-
Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...
- Python爬虫中正则表达式的用法,只讲如何应用,不讲原理
-
Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...
- Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)
-
实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...
- python爬虫教程之爬取当当网 Top 500 本五星好评书籍
-
我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...
- 深入理解re模块:Python中的正则表达式神器解析
-
在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
-
需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...
- 先Mark后用!8分钟读懂 Python 性能优化
-
从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...
- Python“三步”即可爬取,毋庸置疑
-
声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...
- 简单学Python——re库(正则表达式)2(split、findall、和sub)
-
1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...
- Lavazza拉瓦萨再度牵手上海大师赛
-
阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...
- ArkUI-X构建Android平台AAR及使用
-
本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...
- Deepseek写歌详细教程(怎样用deepseek写歌功能)
-
以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...
- “AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测
-
“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...
- AI音乐制作神器揭秘!3款工具让你秒变高手
-
在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 30天学会Python编程:16. Python常用标准库使用教程
- 强烈推荐!Python 这个宝藏库 re 正则匹配
- Python爬虫中正则表达式的用法,只讲如何应用,不讲原理
- Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)
- python爬虫教程之爬取当当网 Top 500 本五星好评书籍
- 深入理解re模块:Python中的正则表达式神器解析
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
- 先Mark后用!8分钟读懂 Python 性能优化
- Python“三步”即可爬取,毋庸置疑
- 简单学Python——re库(正则表达式)2(split、findall、和sub)
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)