uniapp使用sse连接后端,接收后端推过来的消息

小白终成大白

文章目录


前言

一般的请求就是前端发 后端回复 你一下我一下

如果需要有什么实时性的 后端可以主动告诉前端的技术 我首先会想到 websocket

啊 这个东西学名应该是叫流式 流式请求

但是这个websocket长连接 非常消耗服务器性能 不能支持很多用户去同时连接使用

最近听说了一个sse 推送式的

使用场景:我们在做的项目是一个游戏 到达活动时间,需要在所有用户的界面上弹出一个提示框框

这就需要后端到时间告诉前端 也可以前端不断地轮询 去发请求问后端 现在是否有活动

但是都有点消耗服务器 我们的服务器不堪一击

这个时候提出了这个Server-Sent Events sse

一、什么是SSE呢?和websocket的异同点有什么?

话不多说先来点概念

相同点

不同点

二、直接上实现代码

  1. 调用创建sse方法 可以写在某个方法下面 也可以直接写在 "< script setup >< script >"里面 和onLoad方法同级
c 复制代码
 onLoad(async (options) => {
    state.myEnergyName = options.myEnergyName;
    let userInfo = await sheep.$store('user').getInfo();
    state.userId = userInfo.userId;
    //括号里换成你的接口地址
    const sseConnection = createSSEConnection('http://192.168.110.128:9068/notification/sse/subscribe/1000287')
  });

2.方法具体内容

c 复制代码
   function createSSEConnection(url) {
  // 创建一个标准的XMLHttpRequest对象
  const xhr = new XMLHttpRequest()
  xhr.open('GET', url, true)
  xhr.setRequestHeader('Accept', 'text/event-stream')
  xhr.setRequestHeader('Cache-Control', 'no-cache')
  
  // 设置响应类型为文本
  xhr.responseType = 'text'
  
  // 数据缓冲区
  let buffer = ''
  
  // 处理进度事件
  xhr.onprogress = function(e) {
    // 获取新数据
    const newData = xhr.responseText.substring(buffer.length)
    if (newData) {
      buffer += newData
      
      // 按行分割数据
      const lines = newData.split('\n')
      for (const line of lines) {
        if (line.startsWith('data:')) {
          const eventData = line.substring(5).trim()
          // 触发数据处理
          handleSSEData(eventData)
        }
      }
    }
  }
  
  xhr.onerror = function(e) {
    console.error('SSE连接错误:', e)
  }
  
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      if (xhr.status === 200) {
        console.log('SSE连接完成')
      } else {
        console.error('SSE连接失败:', xhr.status)
      }
    }
  }
  
  // 发送请求
  xhr.send()
  
  return xhr
}

// 处理SSE数据
function handleSSEData(data) {
  try {
    const parsedData = JSON.parse(data)
    console.log('收到SSE数据:', parsedData)
    // 处理数据...
  } catch (e) {
    console.log('收到SSE文本:', data)
    // 处理非JSON数据...
  }
}

注意不要重复建立连接 该关闭时要记得关闭

c 复制代码
// 关闭连接
function closeSSE() {
if (sseConnection) {
  sseConnection.abort()
}
}

总结

暂时先用到这些 学会新的招式再来补充

感谢你的阅读

相关推荐
大叔_爱编程10 小时前
基于用户评论的热点问题挖掘与反馈分析系统-django+spider+uniapp
python·django·uni-app·毕业设计·源码·课程设计·spider
源码潇潇和逸逸1 天前
独立部署高校圈子平台:PHP+UniApp打造社交+交易+服务一站式校园解决方案
开发语言·uni-app·php
2501_916008891 天前
2026 iOS 证书管理,告别钥匙串依赖,构建可复制的签名环境
android·ios·小程序·https·uni-app·iphone·webview
2501_915918411 天前
iOS App 拿不到数据怎么办?数据解密导出到分析结构方法
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_916008891 天前
iOS App 抓包看不到内容,从有请求没数据一步步排查
android·ios·小程序·https·uni-app·iphone·webview
扶苏10021 天前
记一次 uni-app开发微信小程序 textarea 的“伪遮挡”踩坑实录
微信小程序·小程序·uni-app
RuoyiOffice2 天前
企业请假销假系统设计实战:一张表、一套流程、两段生命周期——BPM节点驱动的表单变形术
java·spring·uni-app·vue·产品运营·ruoyi·anti-design-vue
KongHen022 天前
uniapp-x实现自定义tabbar
前端·javascript·uni-app·unix
RuoyiOffice2 天前
SpringBoot+Vue3+Uniapp实现PC+APP双端考勤打卡设计:GPS围栏/内网双模打卡、节假日方案、定时预生成——附数据结构和核心源码讲解
java·spring·小程序·uni-app·vue·产品运营·ruoyi
2501_915921432 天前
2026 iOS 上架新趋势 iOS 发布流程模块化
android·ios·小程序·https·uni-app·iphone·webview