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

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

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

SSE&WebSocket

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头信息

Content-Type: text/event-stream

Cache-Control: no-cache

Connection: keep-alive

复制代码

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

消息格式

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

[key]: value\n

复制代码

key 有一下几个值可取

data: 消息内容

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

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

retry: 浏览器重新发起连接的时间间隔。

示例

浏览器端代码

// 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')

})

复制代码

关注我们

sse java8_HTTP 服务器消息推送之SSE相关推荐

  1. tornado服务器动态文件,tornado 实现服务器消息推送功能

    这篇文章介绍tornado 服务器消息推送功能服务器端与客户端实现的的方法. 消息推送的过程: 客户端1 连接请求,服务器先hold 住,别返回: 客户端2 发送消息,服务器把信息返回给 客户端1. ...

  2. Web消息推送之SSE

    文章目录 一.消息推送简介 1.消息推送介绍 2.几种方式介绍 二.SSE原理介绍 1.SSE基础概念 2.SSE特点 3.SSE与WebSocket异同 三.SSE推送实现 1.概述 1.1 使用S ...

  3. SSE 服务端消息推送

    SSE(Server-sent events) SSE 它是基于 HTTP 协议的,一般意义上的 HTTP 协议是无法做到服务端主动向客户端推送消息的.有一种变通方法,就是服务器向客户端声明,发送的是 ...

  4. 服务器微信推送,开启服务器消息推送后收不到微信推送的数据

    appId :wx221563f29cd20a25 在小程序的后台开启了消息推送按文档说的客服消息接入指引操作的 验证成功后未能收到微信服务器推送的post数据. 自己已经使用postman去测试了服 ...

  5. ionic 服务器消息推送,Ionic3 本地消息推送

    项目上有一个消息推送的功能,一开始想使用极光推送,在安卓上测试比较顺利,但是IOS上需要什么证书,没有开发者账号,感觉好麻烦.后面就想在每次启动app的时候,本地推送一次消息,碰巧官网上发现了这个插件 ...

  6. 钉钉 服务器 消息推送,【20210727 更新】 全能推送PushBot(原钉钉推送)支持企业微信,PushPlus,Bark...

    本帖最后由 然后七年 于 2021-7-27 21:51 编辑 公告: 自2021年04月25日起,本项目luci-app-serverchand改名为luci-app-pushbot 全能推送. o ...

  7. 订阅号服务器消息推送数量,如何解决微信公众号一个月只能发4次消息的问题...

    如何解决微信公众号一个月只能发4次消息的问题 发布时间:2021-01-19 09:49:16 来源:亿速云 阅读:120 作者:小新 这篇文章将为大家详细讲解有关如何解决微信公众号一个月只能发4次消 ...

  8. winform服务器消息推送,winform项目——仿QQ即时通讯程序12:服务端程序补充及优化...

    原标题:winform项目--仿QQ即时通讯程序12:服务端程序补充及优化 上一篇文章大概完成了服务端程序,今天继续做项目的时候发现还有一些功能没有做,还有几处地方不够完善.不做好就会影响客户端程序的 ...

  9. 【开发经验】服务器单向推送——SSE

    文章目录 背景 SSE WebSocket SSE实现时间下发功能 代码实现 背景 目前广州疫情,每次出行都需要出示健康码,有的小伙伴比较机智,为了更加快速的通行,对于健康码进行截图,这样就可以很快的 ...

最新文章

  1. KindEditor得不到textarea值的解决方法----摘至天涯
  2. [UWP小白日记-5]转换MVA学院的XML字幕为SRT
  3. FastReport.net分组排序、打印顺序、分页、函数使用语法、数据块编辑
  4. 数组和链表的区别以及应用场景
  5. 开启市场新格局 且看新华三计算与存储新品发布会
  6. 继续畅通工程(HDU-1879 )
  7. 论文笔记--基于 FCM 聚类的跨模态人物图像标注方法-2015
  8. 一个示例让你明白界面与数据分离
  9. 20大中国式弱点营销
  10. 题解 SP4487 【GSS6 - Can you answer these queries VI】
  11. mov文件如何转换成mp4视频
  12. 计算机等级保护 备案,信息安全等级保护备案实施细则
  13. 中望CAD的引线标注格式怎么改_大神说这样学CAD命令,超容易掌握
  14. LeetCode 96~100
  15. 我的世界服务器物品不堆叠,我的世界不可堆叠物品怎么堆叠
  16. uniapp:去掉微信小程序顶部的导航栏
  17. 财务费用分析怎么分析
  18. 到底是不是隔壁老王?责任链模式帮小头爸爸洗绿
  19. 华为移动wifi显示无服务器,华为移动WIFI怎么使用,随时WIFI是路由器吗?
  20. 从CentOS 8到CentOS Stream,到底发生什么事了?

热门文章

  1. tracker启动立马关闭,一直尝试重启
  2. 数据库架构设计——分布式数据库设计
  3. mysql词法分析antlr4_[转载] ANTLR——词法分析
  4. python 异步编程
  5. css指针光标样式小手图标
  6. P10:数组传递下标,删除数组数据
  7. DevilMayCry4
  8. android百度地图overlay卡顿,百度地图maker过多,导致卡顿的优化
  9. JSON字符串与对象,日期对象的转换工具类实现
  10. js中childNodes易错点、详解定义以及用法