• SSE实现服务端给客户端长时间推送消息


    SseEmitter是SpringMVC(4.2+)提供的一种技术,它是基于Http协议的,相比WebSocket,它更轻量,但是SSE是单通道,它只能从服务端向客户端单向发送信息,是HTML5规范的一个组成部分。

     

    SSE 最大的特点,可以简单划分为两个:

    • 长连接;
    • 服务端可以向客户端推送信息;

     SSE 的主要应用场景:

    • 新邮件的提示;
    • 实时监控数据的推送等等;

     

    SSE不支持IE浏览器,需要配合服务端代码实现。 

    此处只是浅浅总结一下前端VUE中的使用以及遇到的一些问题点:

    1. // 客户端代码
    2. if (window.EventSource) {
    3. // 创建 EventSource 对象连接服务器
    4. const source = new EventSource('http://localhost:2000');
    5. // 连接成功后会触发 open 事件
    6. source.addEventListener('open', () => {
    7. console.log('Connected');
    8. }, false);
    9. // 服务器发送信息到客户端时,如果没有 event 字段,默认会触发 message 事件
    10. source.addEventListener('message', e => {
    11. console.log(`message: ${e.data}`);
    12. }, false);
    13. // 自定义 EventHandler,在收到 event 字段为 slide 的消息时触发
    14. source.addEventListener('slide1', e => {
    15. console.log(`slide1: ${e.data}`); // => data: 7
    16. }, false);
    17. // 连接异常时会触发 error 事件并自动重连
    18. source.addEventListener('error', e => {
    19. if (e.target.readyState === EventSource.CLOSED) {
    20. console.log('Disconnected');
    21. } else if (e.target.readyState === EventSource.CONNECTING) {
    22. console.log('Connecting...');
    23. }
    24. }, false);
    25. } else {
    26. console.error('您的浏览器不支持SSE');
    27. }
    28. }

     

    我自己项目中的应用实例(车辆实时位置):

    1. // 1. 在data中定义SSE数据对象
    2. sseSourceData: null,
    3. // 2. 离开该页面时关闭连接
    4. destroyed() {
    5. if(this.sseSourceData) {
    6. this.sseSourceData.close();
    7. }
    8. },
    9. // 3. 获取车辆位置信息
    10. getRealTimeGpsSSE() {
    11. // 判断浏览器是否支持SSE技术
    12. if (window.EventSource) {
    13. let url = '';
    14. if(process.env.NODE_ENV === "development") {
    15. // 开发环境
    16. url = process.env.VUE_APP_URL + process.env.VUE_APP_SSE;
    17. } else {
    18. // 正式环境
    19. url = window.location.protocol + '//' + window.location.host + process.env.VUE_APP_SSE;
    20. }
    21. // 实时获取车辆数据
    22. this.sseSourceData = new EventSource(`${url}gps/接口名?参数&&参数`);
    23. this.sseSourceData.addEventListener('message', e => {
    24. console.log(JSON.parse(e.data));
    25. }, false);
    26. } else {
    27. console.error('您的浏览器不支持SSE!');
    28. }
    29. },

    打包后遇到的问题

    使用127.0.0.1打包部署后,SSE请求连接无数据,会报跨域

    解决办法:

    需要判断开发环境还是正式环境:

            开发环境 - 使用配置文件中设置的url拼接;

            正式环境 - 获取当前浏览器上方的地址进行url拼接;

     

     以上只是对自己项目中用到的内容做了简单的总结!

  • 相关阅读:
    拼多多item_get_app - 根据ID取商品详情原数据
    java SpringBoot基础
    L1-028 判断素数(Lua)
    最长上升子序列 II
    如何进行远程adb真机调试?
    条例26~30(实现)
    Lake Formation 和 IAM 之间的区别与联系
    [unity][通过代码]控制模型旋转,动态改变模型角度,让模型转动到固定角度
    java计算机毕业设计ssm+vue基本微信小程序的手机预约维修系统
    基于Boostrap+jsp+spring+mysql的音乐推荐系统
  • 原文地址:https://blog.csdn.net/keke11211/article/details/126405565