springboot 2整合websocket推送消息、数据流、解析pdf图片并压缩
yuyutoo 2025-01-21 22:37 2 浏览 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()方法
相关推荐
- 建筑福利-pdf转dwg格式转换器,再也不用描图-极客青年
-
作为一名经常熬夜画图的建筑狗或者cad用户,你体验过pdf图纸描图到cad吗?前几天一个老同学找我,说他的毕业设计需要我帮忙,发给我一份pdf图纸文件,问我怎么把pdf图纸转换成dwg格式。机智的我灵...
- 想学 HTML,不知从何入手?看完这篇文章你就知道了
-
很多人都说HTML是一门很简单的语言,看看书,看看视频就能读懂。但是,如果你完全没有接触过,就想通过看一遍教程,背背标签,想要完全了解HTML,真的有点太天真了。HTML中文...
- 「前端」HTML之结构
-
今天继续为大家分享前端的知识,如果对前端比较感兴趣的小伙伴,可以关注我,我会更大家继续分享更多与前端相关的内容,当然如果内容中又不当的或者文字错误的,欢迎大家在评论区留言,我会及时修改纠正。1.初识H...
- 手把手教你使用Python网络爬虫下载一本小说(附源码)
-
大家好,我是Python进阶者。前言前几天【磐奚鸟】大佬在群里分享了一个抓取小说的代码,感觉还是蛮不错的,这里分享给大家学习。...
- 用于处理pdf文件格式的转换器
-
在上传过程中如果单个文件太大则容易中断,而且文件太大的话对与存储也有些弊端。那么我们应该想到将文件进行压缩(注意这里压缩指的是不改变文件格式的压缩,而不是用变成压缩文件。这里就将以下用专门的软件压缩P...
- 乐书:在线 Kindle 电子书制作和转换工具
-
之前Kindle伴侣曾推荐过可以在Windows和Mac系统平台上运行的kindle电子书制作软件Sigil(教程),用它可以制作出高质量的的ePub格式电子书,当然最后还需要通...
- 付费文档怎么下载?教你5种方法,任意下载全网资源
-
网上查资料的时候,经常遇到需要注册登录或者付费的才能复制或者是下载,遇到这种情况大多数人都会选择重新查。...
- 捡来的知识!3种方法随便复制网页内容,白嫖真香呀
-
网上的资源真的多,所以许多人常常会从网上找资料。我们看到感兴趣的内容,第一时间可能会想要收入囊中。比如说截个图啊,或者挑选有意思的句子复制粘贴,记录下来。可是,有些时候,却会遇到这样的情况:1、内容不...
- AI的使用,生成HTML网页。
-
利用deepseek,豆包,kimi以及通义千问,写入相同的需求。【写一个网页,实现抽奖功能,点击“开始”,按键显示“停止”,姓名开始显示在屏幕上,人员包括:“张三”,“里斯”,“Bool”,“流水废...
- pdf转换成jpg转换器 4.1 官方正式版
-
pdf转换成jpg工具软件简介pdf转换成jpg转换器是一款界面简洁,操作方便的pdf转换成jpg转换器。pdf转换成jpg转换器可以将PDF文档转换为JPG,BMP,GIF,PNG,TIF图片文件。...
- 办公必备的office转换成pdf转换器怎么用?
-
2016-02-2415:53:37南方报道网评论(我要点评)字体刚从校园走出社会,对于快节奏的办公环境,难免会觉得有些吃力。在起步阶段力求将手头上的事情按时完工不出错,但是渐渐的你会发现,别人只...
- 为什么PDF转Word大多要收费?
-
PDF转Word大多都要收费?并非主要是因为技术上的难度,而是基于多方面的商业和版权考虑的,下面给大家浅分析下原因:...
- 如何用python生成简单的html report报告
-
前提:用python写了一个简单的log分析,主要也就是查询一些key,value出来,后面也可以根据需求增加。查询出来后,为了好看,搞个html表格来显示。需要的组件:jinja2flask...
- 学用系列|如何搞定word批量替换修改和格式转换?这里一站搞定
-
想必不少朋友都会碰到批量修改word文档内容、压缩文档图片、文件格式转换等重复性文档处理工作的需要,今天胖胖老师就推荐给大家一个免费工具XCLWinKits,一站搞定你所有的需要。什么是XCLWinK...
- 这款PDF文档转换神器,能帮你解决PDF使用中的许多难点
-
不管是平时的学习还是工作,相信许多朋友都经常接触PDF文件。可以说,PDF文件在我们的日常办公学习过程中的重要性和Word文档一样重要。在之前的更新中,小编介绍了几款非常不错的PDF文档格式转换软件,...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)