服务器推送消息SSE,HTTP 服务器消息推送之SSE

2023-11-07

HTTP 服务器推送也称 HTTP 流,是一种客户端-服务器通讯模式,它将信息从 HTTP 服务器异步推送到客户端,而无需客户端请求。如今的 web 和 app 中,愈来愈多的场景使用这种通讯模式,好比实时的消息提醒,IM在线聊天,多人文档协做等。之前实现这种相似的功能通常都是用ajax长轮询,而如今咱们有了新的、更优雅的选择 —— WebSocket 和 SSE。javascript

WebSocket是HTML5开始提供的一种在单个 TCP 链接上进行全双工通信的协议。在WebSocket API中,浏览器和服务器只须要作一个握手的动做,而后,浏览器和服务器之间就造成了一条快速通道。二者之间就直接能够数据互相传送。浏览器经过 JavaScript 向服务器发出创建 WebSocket 链接的请求,链接创建之后,客户端和服务器端就能够经过 TCP 链接直接交换数据。当你获取 Web Socket 链接后,你能够经过 send() 方法来向服务器发送数据,并经过 onmessage 事件来接收服务器返回的数据。java

SSE 是 Server-Sent Events 的简称, 是一种服务器端到客户端(浏览器)的单项消息推送。对应的浏览器端实现 Event Source 接口被制定为HTML5 的一部分。不过如今IE不支持该技术。相比于 WebSocket,SSE 简单不少,服务器端和客户端工做量都要小不少、简单不少,同时实现的功能也要有局限。node

SSE&WebSocket

663434915cb867696d314ac062b70ef6.png SSE与WebSocket有类似功能,都是用来创建浏览器与服务器之间的通讯渠道。二者的区别在于:

WebSocket是全双工通道,能够双向通讯,功能更强;SSE是单向通道,只能服务器向浏览器端发送。

WebSocket是一个新的协议,须要服务器端支持;SSE则是部署在 HTTP协议之上的,现有的服务器软件都支持。

SSE是一个轻量级协议,相对简单;WebSocket是一种较重的协议,相对复杂。

SSE默认支持断线重连,WebSocket则须要额外部署。

SSE支持自定义发送的数据类型。

SSE不支持CORS,参数url就是服务器网址,必须与当前网页的网址在同一个网域(domain),并且协议和端口都必须相同。WebSocket支持

客户端 EventSource

API

[Constructor(DOMString url, optional EventSourceInit eventSourceInitDict)]

interface EventSource : EventTarget {

readonly attribute DOMString url;

readonly attribute boolean withCredentials;

// ready state

const unsigned short CONNECTING = 0;

const unsigned short OPEN = 1;

const unsigned short CLOSED = 2;

readonly attribute unsigned short readyState;

// networking

attribute EventHandler onopen;

attribute EventHandler onmessage;

attribute EventHandler onerror;

void close();

};

dictionary EventSourceInit {

boolean withCredentials = false;

};

复制代码

基本用法

建立EventSource 实例

var source = new EventSource(url)

复制代码

事件监听

// 创建链接后,触发`open` 事件

source.onopen = (event)=>{

// ...

}

// 收到消息,触发`message` 事件

source.onmessage = (event)=>{

// ...

}

// 发生错误,触发`error` 事件

source.onerror = (event)=>{

// ...

}

// 自定义事件

source.addEventListener('eventName', event => {

// ...

}, false)

复制代码

关闭链接

source.close()

复制代码

服务器端开发

响应头设置

SSE的相应,须要设置以下的Http头信息web

Content-Type: text/event-stream

Cache-Control: no-cache

Connection: keep-alive

复制代码

第一行,Content-Type 指定的 MIME 类型必须为 text/event-streamajax

消息格式

SSE 推送的消息必须是UTF-8编码的纯文本。每次推送有若干个事件消息组成,每一个事件消息之间用两个换行(\n\n)分割。每一个事件消息又有若干行组成,每行格式以键值对形式组成:express

[key]: value\n

复制代码

key 有一下几个值可取浏览器

data: 消息内容

event: 消息事件名称,默认为 message,浏览器能够用 addEventListener()监听该事件。

id: 消息编号。浏览器用lastEventId属性读取这个值。一旦链接断线,浏览器会发送一个 HTTP 头,里面包含一个特殊的Last-Event-ID头信息,将这个值发送回来,用来帮助服务器端重建链接。所以,这个头信息能够被视为一种同步机制

retry: 浏览器从新发起链接的时间间隔。

示例

浏览器端代码bash

// index.js

var source = new EventSource('/stream');

source.onmessage = function(event){

var message = event.data;

// do stuff based on received message

};

复制代码

服务器端代码(nodejs)服务器

var express = require('express')

var fs = require('fs')

var app = express()

app.get('/stream', (req, res) => {

res.writeHead(200, {

"Content-Type": "text/event-stream",

"Cache-Control": "no-cache",

"Connection": "keep-alive"

});

var interval = setInterval(function (){

res.write("data: " + (new Date()) + "\n\n");

}, 1000);

req.connection.addListener("close", function (){

clearInterval(interval);

}, false);

})

app.listen(9999, (err) => {

if (err) {

console.log(err)

return

}

console.log('listening on port 9999')

})

复制代码

关注咱们

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务器推送消息SSE,HTTP 服务器消息推送之SSE 的相关文章

  • 更改wsl中系统的安装位置

    wsl默认安装位置是C盘 众所周知C盘总是不够用的 所以才有了把wsl的系统迁移到其它位置的需求 官网文档 首先查看所有分发版本 wsl l all v 列出已安装的Linux发行版 wsl list verbose 导出分发版为tar文件
  • NGUI扩展之 图片置灰

    需求置灰 在属性 面板添加一个小功能 置灰属性 设计思路很简单 就是通过勾选或者不勾选 实现置灰 或者不置灰 包括对scroview的置灰等等 效果预览 代码分析 实际上 在NGUI中 所有需要渲染的 物体 都继承自 wight 而编辑器
  • uni-app开发微信小程序修改微信原生组件样式不生效(踩坑)

    在子组件中使用微信原生组件 通过在子组件内通过局部样式修改微信原生组件样式 发现在父组件中显示时修改的样式并不生效 例如
  • 【旋转字符串的四种方法】

    目录 前言 一 题目描述 二 题目解析 一 依次左旋 二 创建中间数组 三 三次倒置 四 接长数组 总结 前言 来源 力扣 LeetCode 旋转字符串 一 题目描述 题目描述 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部
  • 全网最全Python项目体系练习500例(附源代码),练完可就业系列

    1 有一个jsonline格式的文件file txt大小约为10K 2 补充缺失的代码 3 输入日期 判断这一天是这一年的第几天 4 打乱一个排好序的list对象alist 5 现有字典 d a 24 g 52 i 12 k 33 请按va
  • Python 控制台 窗口 布局乱了

    使用的过程中不小心手贱 移动了窗口 把窗口独立出来了 看着比较别扭 点击左上角debug按键后 会在左下角出来如下图片 选择中间三个方块按键 恢复布局 之前乱了的窗口 就变成初始化状态了
  • QGIS 栅格数据裁剪(扣除)

    利用QGIS 以矢量数据范围来扣除栅格数据中的区域 其实也就是赋0值 首先 安装Easy Raster Splitter 插件 准备好矢量数据和栅格数据 打开Easy Raster Splitter 插件 Method 选择 Extract
  • 实时追踪科研动态丨谷歌、马克斯·普朗克光科学研究所等机构精选新论文

    作为科研人员 每天需要检索和浏览大量的学术文献 以获取最新的科技进展和研究成果 然而 传统的检索和阅读方式已经无法满足科研人的需求 AMiner AI 一款集检索 阅读 知识问答于一体的文献知识工具 帮助你快提高检索 阅读论文效率 获取最新
  • ABAP程序修改提示不是原始系统解决方法

    SE03修改原始系统
  • 使用corr()计算相关系数

    import pandas as pd catering sale data catering sale all xls data pd read excel catering sale index col u 日期 print data
  • AntV G6鼠标移入、单击、双击节点,获取节点信息

    如下图所示 对节点常用的事件如下图所示 主要代码 鼠标进入节点 this graph on node mouseenter e gt const nodeItem e item 获取鼠标进入的节点元素对象 console log 鼠标移入
  • 搭建前后端完整结构

    文章目录 一 搭建后端完整结构 1 后端结构说明 1 1 后端作用 1 2 代码结构 1 3 后端测试要求 1 4 编辑 UserController 1 5 编辑UserService UserServiceImpl 1 6 页面展示效果
  • 聚合函数与窗口函数

    聚合函数 回答一 聚合函数 Aggregate Functions 是SQL中的函数 用于对一组数据进行计算 并返回单个结果 聚合函数通常用于统计和汇总数据 包括计算总和 平均值 计数 最大值和最小值等 以下是一些常见的聚合函数 SUM 计
  • myQsort()排序函数

    题目说明 实现一个函数myQsort 可以对Int char 字符串或者其他类型进行排序的函数 提示函数只需要提供排序方法 比较方法通过函数指针 让用户自定义 示例代码 include
  • 100天精通Python(爬虫篇)——第44天:常用爬虫requests模块基础+代码实战

    文章目录 一 request模块大总结 1 下载安装 2 常用属性或方法 3 response text和response content的区别 4 发送带headers参数请求 5 发送带参数请求 6 在headers参数中携带cooki
  • [Linux] linux系统安装git

    目录 前言 一 git的安装方式 二 git 安装流程 2 1 解压下载的压缩包 三 配置Git 3 1 配置git名字和邮箱 3 2 查看名字和邮箱 四 总结 前言 Git是一种分布式版本控制系统 广泛用于软件开发和版本管理 它可以跟踪文
  • Could not resolve placeholder 'foo' in value "${foo}" 解决方法

    D Program Files Java jdk1 8 0 101 bin java agentlib jdwp transport dt socket address 127 0 0 1 50162 suspend y server n
  • 详尽图文,用Intellij Idea创建一个普通的Java工程并用JDBC连接数据库

    Intellij Idea作为一款编程工具 自从尝到它的强大功能带来的甜头后 就再也不想用Eclipse来进行开发了 下面用它来演示一下如何创建一个普通的Java工程 并导入MySql数据库的驱动包 用JDBC方式来连接数据库 Intell
  • HDL4SE:软件工程师学习Verilog语言(四)

    4 模拟器 总是不能运行一个应用程序 对学习语言是致命的 一个Hello World 级别的应用就这么复杂 时间长了会把人的耐心磨尽 因此本节我们先暂停对verilog语言的学习 来讨论模拟器的实现 试图给出一个初步的实现 至少能够完成前面

随机推荐

  • 计算机视觉中的半监督学习

    原文 Amit Chaudhary Semi Supervised Learning in Computer Vision https amitness com 2020 07 semi supervised learning 2020 计
  • 【DDR3 控制器设计】系列博客汇总篇(附直达链接)

    写在前面 本篇为 DDR3 控制器设计系列博客的汇总篇 此系列包含 DDR3 的相关实验 认识 MIG 初始化 读写操作 FIFO 接口等 并附上直达链接 目前只更新了部分文章 持续学习更新中 博客汇总 Project 1 DDR3 控制器
  • 【SSH】如何删掉远程服务器中的虚拟环境?如何删掉远程服务器中的用户?如何删掉某个文件夹?

    文章目录 一 如何删掉远程服务器中的虚拟环境 二 如何删掉远程服务器中的用户 三 如何删掉某个文件夹 一 如何删掉远程服务器中的虚拟环境 在Linux系统下删除conda虚拟环境 删除虚拟环境 conda remove n your env
  • 无线局域网安全协议(WEP、WPA、WAPI)

    文章目录 一 WEP 有线等效保密 二 WPA Wi Fi网络安全接入 三 WAPI 无线局域网鉴别和保密基础结构 WLAN Wireless Local Area Network 指应用无线通信技术将计算机设备互联起来 构成可以互相通信和
  • 分块矩阵求逆不能想当然

    分块矩阵给实际运算带来了很大的方便 对于行列数都很大的矩阵 可以将其分割成一个个小块进行计算 减少了运算的繁琐程度 分块矩阵的求逆有两个非常有用的公式 能帮助我们快速得出正确结果 但是是不对的 只能假设逆矩阵 再通过求多元方程组得出逆矩阵的
  • 【华为od机试】约瑟夫问题-Python3

    题目描述 篮球 5V5 比赛中 每个球员拥有一个战斗力 每个队伍的所有球员战斗力之和为该队伍的总体战斗力 现有10个球员准备分为两队进行训练赛 教练希望2个队伍的战斗力差值能够尽可能的小 以达到最佳训练效果 给出10个球员的战斗力 如果你是
  • DLL的远程注入技术

    转载自 http blog csdn net bai bzl article details 1801023 一 DLL注入 DLL的远程注入技术是目前Win32病毒广泛使用的一种技术 使用这种技术的病毒体通常位于一个DLL中 在系统启动的
  • Spark集群搭建记录

    本文目录 写在前面 step1 Spark下载 step2 修改环境变量 bashrc etc profile step3 配置Master 文件修改 slaves spark env sh step4 配置slave节点 step5 集群
  • 图形图像基础 之 jpeg介绍

    一 概念 jpeg相关概念简介 jpeg 一种影像有损压缩标准方法 后缀jpg jpeg JPEG Joint Photographic Experts Group 联合图像专家小组 是一种针对照片影像而广泛使用的有损压缩标准方法 面向连续
  • 【报错】onMounted is called when there is no active component instance too be associated with.

    文章目录 报错 分析 解决 报错 onMounted is called when there is no active component instance too be associated with Lifecycle injecti
  • 统计分析:聚类分析(详细讲解)

    聚类分析是研究 物以类聚 的一种方法 人类认识世界往往首先将被认识的对象进行分类 早起人们主要靠经验和专业知识实现分类 但随着生产技术和社会科学的发展 对分类学的要求越来越高 靠经验和专业知识来分类越来越难 于是数学这一有力工具被引入分类学
  • textarea接受后台数据

    在jsp页面使用EL接受后台数据到textarea
  • mybatis-plus-generator生成实体类时添加jdbcType

    效果 需要修改的文件 1 基本思路 1 使用变量 useJdbcType 控制是否需要生成jdbcType 2 生成时拼接相关字段信息 2 步骤 2 1重写TableField 添加jdbcType属性 在com baomidou myba
  • rollup怎么处理.node文件

    Rollup 是一个 JavaScript 模块打包器 它可以将多个模块合并成单个文件 它可以帮助你将你的代码打包成可以在浏览器中运行的文件 要使用 Rollup 处理 node 文件 你需要使用一个 Rollup 插件 如 rollup
  • 数据挖掘基础

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 数据挖掘定义及用途 1 定义 2 用途 二 决策树 1 理论知识 1 概念 2 算法一般过程 C4 5为例 2 小结 三 关联规则 1 概述 2 关联分析
  • MySQL之多表关联删除/更新

    日常测试的时候 需要连接其他表而删除某些脏数据 按照正常的查询的写法 会这样写删除语句 DELETE from order where id in SELECT o id from order o LEFT JOIN customer c
  • minicom键盘失效,不能输入问题

    转 http blog sina com cn s blog 5d0e8d0d01015svy html 这个问题可以参考secureCRT的时候遇到的问题 问题与minicom的一样 RTS 请求发送 CTS 清除发送 默认情况下mini
  • vue3配置proxy解决跨域

    跨域问题是前端开发中较常见的问题 因为javascript的浏览器会支持同源策略 如果域名 协议 端口任意不同就会产生跨域 如果非同源 那么在请求数据时 浏览器会在控制台中报一个异常 提示拒绝访问 错误信息如下 Access to XMLH
  • Linux常用命令整理(适合初学)

    关机 重启操作 帮助文档 1 帮助命令 1 1 help help cd 查看cd命令的帮助信息
  • 服务器推送消息SSE,HTTP 服务器消息推送之SSE

    HTTP 服务器推送也称 HTTP 流 是一种客户端 服务器通讯模式 它将信息从 HTTP 服务器异步推送到客户端 而无需客户端请求 如今的 web 和 app 中 愈来愈多的场景使用这种通讯模式 好比实时的消息提醒 IM在线聊天 多人文档