websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...
问题背景
为什么要要用websocket呢?websocket相对于传统http协议有什么优势呢?
http协议有一个缺陷,就是通信只能由客户端发起,服务器返回数据,不能做到服务器主动向客户端推送。这就导致了一个弊端,假如我要获得服务器连续的状态变化,那么我只能每隔一段时间向服务器发起请求,也就是所谓的轮询,这就导致了大量的资源浪费。由此,websocket应运而生,来解决这一痛点。
websocket使用tcp连接保持全双工通信协议,服务器端比较容易实现;
数据格式比较轻量,通信比较高效;
既能发送文本,也能发送二进制数据,没有同源限制;
wbsocket响应报文与http不同,如下
websocket响应报文
好了,简单的了解一下,我们来看看springboot+websocket实现推送的过程,以下是个简单的demo。
搭建过程
首先我们初始化一个spring boot项目,大家可以根据自己的习惯去官网下载或者用idea来生成,这里我不多说,主要的是引入websocket依赖,如下图;
websocket依赖
编写websocket配置类,这里直接new 一个ServerEndpointExporter就行了
@Componentpublic class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter(); }}
编写websocket推送服务端
@Component@ServerEndpoint(value = "/websocket/logging")public class LoggingWSServer {private static final Logger LOGGER = LoggerFactory.getLogger(LoggingWSServer.class);private static Map sessionMap = new ConcurrentHashMap<>();private static Gson gson = new Gson();private static Map map = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(Session session) {new Thread(() -> { // 这里大家可以根据业务来优化,使用线程池等手段 while(sessionMap.get(session.getId()) != null) { try { List list = aaaServerService.findList(); if(session.isOpen()) { send(session, gson.toJson(list)); } Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } @OnClose public void onClose(Session session) { sessionMap.remove(session.getId()); LOGGER.info("session断开连接:{}" , session.getId()); } @OnMessage public void onMessage(String message,Session session) { LOGGER.info("收到客户端的消息:{}",message); map.put("ret",message); send(session,gson.toJson(map)); } private void send(Session session, String toJson) { try { session.getBasicRemote().sendText(toJson); } catch (IOException e) { LOGGER.error("发送错误:{}",e.getMessage()); } } }
服务端api解释:
OnOpen:在这个端点连接时被调用;
OnClose:与OnOpen相反,连接断开时被调用
OnMessage:服务端收到客户端的信息时被调用
OnError:当然还有这个,上面没有列出,这是发送错误时被调用
编写前端页面,这里只展示js
//websocket对象 var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { //动态获取域名或ip var hostname = window.location.hostname; port = window.location.port; websocket = new WebSocket("ws://"+hostname+":" + port + "/websocket/logging"); } else { console.error("不支持WebSocket"); } //连接发生错误的回调方法 websocket.onerror = function (e) { console.error("WebSocket连接发生错误" + e); }; //连接成功建立的回调方法 websocket.onopen = function () { console.log("WebSocket连接成功") }; //接收到消息的回调方法 websocket.onmessage = function (event) { console.log("数据是:", event.data ); var data = JSON.parse(event.data); if (data.push) { // 内容 var temp = template('tpl_data',{data : data.push}); console.log("模板==" + temp); document.getElementById("tb").innerHTML = temp; } if(data.ret) { console.log(data.ret) alert(data.ret); } } //发送消息 $('#send').click(function () { websocket.send($('#sMsg').val()); });
前端页面注意:
编写的时候一定要注意一个地方,就是new WebSocket 的地址,一定要和服务端推送的那个地址相同,不然的话,这里接收不到推送过来的数据。
另外,有些浏览器可能不支持websocket,也没关系,可以使用sockjs或者stomp.js,这是基于websocket的上层协议,大家可以自行去了解以下。不过要注意,sockjs 处理的url是http或者https,不在是以ws开头的。
结语
今天就简单的介绍到这里,有需要这个demo的,可以关注一下小编,后续小编会把代码上传到gitee,https://gitee.com/bigqianqian/springboot-websocket,可以了解下。
来源:
“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com
来都来了,走啥走,留个言呗~
IT大咖说 | 关于版权
由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!
感谢您对IT大咖说的热心支持!
相关推荐
推荐文章
Terminal Preview 1.4 发布,支持超链接
线上JVM调优实践,FullGC40次/天到10天一次的优化
Andy邀你共探未来“数据酷”世界
很少用到,但掏出来让人感到牛逼的Web API
Win10又翻车,微软承认9月补丁存在Bug,SSD硬盘遭殃
Linux Lab v0.5 正式发布,功能强大,用法简单
websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...相关推荐
- js 链接websocket马上断开_SpringBoot+WebSocket实现简单的数据推送
问题背景 为什么要要用websocket呢?websocket相对于传统http协议有什么优势呢? http协议有一个缺陷,就是通信只能由客户端发起,服务器返回数据,不能做到服务器主动向客户端推送.这 ...
- NodeJs本地搭建服务器,模拟接口请求,获取json数据
最近在学习Node.js,虽然就感觉学了点皮毛,感觉这个语言还不错,并且也会一步步慢慢的学着的,这里实现下NodeJs本地搭建服务器,模拟接口请求,获取json数据. 具体的使用我就不写了,这个博客写 ...
- HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)
传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据 ...
- springboot+rabbitmq+vue实现stomp协议消息推送
springboot+rabbitmq+vue实现stomp协议消息推送 一.rabbitmq添加stomp插件 rabbitmq 默认是没有开启Socket STOMP插件的.如需使用,例如集成sp ...
- 服务器之间数据文件推送,数据库数据推送到另外服务器
数据库数据推送到另外服务器 内容精选 换一换 该方案优点是简单,容易上手,缺点是停机时间较长.因此它适用于数据量不大,或者允许停机的时间较长,并且在这个时间范围内能够完成的数据.由于云数据库RDS服务 ...
- WebSocket + SpringBoot + VUE实现后端实时向前端推送消息
一.目的 众所周知,正常来说在前后端通信中,后端往往处于一个被动的状态,对前端的请求作出对应的响应.但有的时候我们会遇到需要后端前前端推送数据的需求,比如消息.邮件等的推送.这个时候,实现的一种方式是 ...
- unity使用websocket接受服务器数据推送
最近考虑到项目中如果监听一个设备信息的话,需要持续的监听,如果用unity一直请求的话会很消耗性能,所以在网上搜了一下,发现这种需求叫推送服务,在网上找到好多说用插件的,但是我不想用插件,然后找到了一 ...
- flask+socketio+echarts3 服务器监控程序(基于后端数据推送)
本文地址:http://www.cnblogs.com/hhh5460/p/7397006.html 说明 以前的那个例子的思路是后端监控数据存入数据库:前端ajax定时查询数据库. 这几天在看web ...
- SpringBoot实现微信支付流程+RabbitMQ消息推送
微信支付 整个流程使用到的组件代码: 链接:https://pan.baidu.com/s/1v5415tEtetxdsp4o7HMy5A 提取码:ys87 二维码创建 利用qrious制作二维码插件 ...
最新文章
- IKE SA和IPSec SA的区别
- Vue.js 2.x render 渲染函数 JSX
- ks minidriver 开发总结
- Asp.net正则获取html内容
- 自定义SpringBoot项目的Maven原型
- 【转】Linux将composer的bin目录放到PATH环境变量中
- #动态规划 LeetCode 120 三角形最小路径和
- 转:Qt 嵌入式开发环境搭建
- otsu结合OpenCV实现灰度图像自动阈值处理
- [4G5G专题-17]:需求-5G发展的主要驱动力
- ZYNQ图像处理项目——帧差法运动目标跟踪
- 条件关系和因果关系,原因和理由的区别
- 深度探索C++对象模型(一):关于对象
- Spatial Dropout
- 【转】在 26 岁时写给 18 岁的自己--Livid
- 叠片过滤器:过滤器设备的普遍使用
- Python自动翻译英语论文PDF(三十九)
- Macbook 开发之器,Mac OSX 应用软件,开发工具必备网站推荐
- 在gitlab上 与fork的源代码保持同步
- 学校计算机机房应急预案,中心机房应急预案管理制度