SSE与WebSocket作用相似,都是建立浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息。 但是WebSocket比SSE强大很多,SSE只能作为一个轻量级的消息推送方案,解决了从服务端向客户端单向推送消息的场景,而Websocket是全双工通道,可以双向通信。 SSE应用场景可以是微博更新、股价更新、消息通知、赛事结果等。

目前主流浏览器都支持SSE,但是IE系除外。

客户端代码

先来看客户端代码,新建一个html页面文件,在script部分添加以下代码:

if(typeof(EventSource) !== "undefined") {

let source = new EventSource("sse.php");

source.onmessage = (e) => {

if (e.data == 'null') {

return false;

} else {

let edata = JSON.parse(e.data);

$('#result').append(edata.id + ':' + edata.message + "
");

}

};

} else {

alert('您的浏览器不支持SSE');

}

首先,使用typeof(EventSource)来判断浏览器对SSE的支持情况。

接着创建一个新的EventSource对象,然后定义发送更新的服务端的 URL(本例中是 "sse.php"),如果是跨域的请求,需要这样设置:let source = new EventSource("http://xxx.com/sse.php", { withCredentials: true });,并需要服务端代码开启允许跨域。

每接收到一次更新,就会发生 onmessage 事件。

当 onmessage 事件发生时,把已接收的数据推入 id 为 #result 的元素中。

EventSource 对象支持3种事件:

onopen:当通往服务器的连接被打开时触发。

onmessage:当接收到消息时触发。

onerror:当发生错误时触发。

出于安全,我们可以在onmessage事件中检测消息的来源域:

source.onmessage = (e) => {

if (e.origin != 'https://www.helloweba.net') {

alert('消息来源不属于https://www.helloweba.net');

return;

}

...

}

服务端代码

我们使用PHP来写一个服务端发送数据的例子,当然你也可以使用Java/Python等任意服务端语言实现。

服务器端事件流的语法是非常简单的。把 "Content-Type" 报头设置为 "text/event-stream"。现在,就可以开始发送事件流了。

header('X-Accel-Buffering: no');

header('Content-Type: text/event-stream');

header('Cache-Control: no-cache');

ob_end_clean();

ob_implicit_flush(1);

while(1){

$data = [

"id" => time(),

"message" => '欢迎来到helloweba,现在是北京时间'.date('Y-m-d H:i:s')

];

returnEventData($data);

sleep(10);

}

function returnEventData($returnData, $event='message', $id=0, $retry=0){

$str = '';

if($id>0){

$str .= "id: {$id}".PHP_EOL;

}

if($event){

$str.= "event: {$event}".PHP_EOL;

}

if($retry>0){

$str .= "retry: {$retry}".PHP_EOL;

}

if(is_array($returnData)){

$returnData = json_encode($returnData);

}

$str .= "data: {$returnData}".PHP_EOL;

$str .= PHP_EOL;

echo $str;

}

以上代码流程大致为:

1.把报头 "Content-Type" 设置为 "text/event-stream";

2.规定不对页面进行缓存;

3.输出发送数据;

4.向客户端刷新输出数据。

注意:每一次发送的信息,由若干个message组成,每个message内部由若干行组成,每一行都是如下格式。

[field]: value\n

其中[field]有四个值,分别是:

id:数据标识符用id字段表示,相当于每一条数据的编号。

event:表示自定义的事件类型,默认是message事件。浏览器可以用addEventListener()监听该事件。

retry:指定浏览器重新发起连接的时间间隔。当时间间隔到期会重连,另外一个是由于网络错误等原因,导致连接出错时也会重连。

data:数据内容,如果数据很长,可以分成多行,最后一行用\n\n结尾,前面行都用\n结尾。

完整的消息内容格式:

id: msg1\n

event: foo\n

retry: 10000\n

data: some text\n

data: another message\n

data: with two lines \n\n

上述代码中,我们设置了每隔10秒钟向客户端输出一条数据,实际应用中服务端有个任务当发现新的数据时就触发输出流事件。

php 通知客户端,PHP+SSE服务器向客户端推送消息相关推荐

  1. android点击通知跳转到服务,Android 接收推送消息跳转到指定页面的方法

    问题的提出 本次接入的是个推,其他家的推送没有研究过,思路应该是类似的 App在前台,这个时候需要弹出一个对话框,提醒用户有新的消息,是否要查看,查看的话跳转到指定页面 App在后台,或是App进程已 ...

  2. 服务器主动推送消息数据给客户端

    1 引言 这个问题第一次是我在实现一个导师的方案的时候所发现的,一开始我需要实现服务器与客户端的密钥协商和数据传递,服务器需要主动分发(推送)密钥给客户端,因为以前没有做过相关编码,后来只能想到用反向 ...

  3. 服务器向客户端推送消息之——WebSocket详细使用

    文章目录 1. 引言 2. WebSocket使用步骤 2.1 引入依赖 2.2 创建WebSocket配置类 2.3 WebSocket服务类 2.4 前端页面 1. 引言 最近遇到一个生活场景,需 ...

  4. web应用从服务器主动推送消息到客户端到方式

    总结帖 为什么需要服务端向客户端推送消息? 在某些应用功能中,例如定位,游戏,社交消息的推送等,用户都是被动接受u消息的,为了处理这类问题,需要服务端向客户端推送消息. 引言: 普通情况下,有客户端向 ...

  5. asp服务器推送消息,asp.net实时向客户端推送消息(SignalRWeb)

    [实例简介]ASP.net中服务器端向客户端推送消息,多用于在线聊天 [实例截图] [核心代码] using System; using System.Collections.Generic; usi ...

  6. nett服务器接收消息的方法,C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用...

    C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用 运行效果: 1.安装Microsoft.AspNetCore.Signa ...

  7. DWR实现服务器端向客户端推送消息

    2019独角兽企业重金招聘Python工程师标准>>> 1.简介 DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框 ...

  8. 服务端如何推送消息给客户端?

    大家好,我是前端西瓜哥,今天带大家了解一下服务端如何推送消息给客户端. 有时候,我们希望服务端能够主动推送一些信息给客户端.但 HTTP 协议只能让客户端发起请求然后服务端响应,而无法让服务端主动去发 ...

  9. Asp.net webApi 通过WebSocket推送消息给客户端,搭建一个即是服务端又是客户端的服务

    Asp.net webApi 通过WebSocket推送消息给客户端,搭建一个即是服务端又是客户端的服务_IT_ziliang的博客-CSDN博客 WebSocket是一种在单个TCP连接上进行全双工 ...

最新文章

  1. linux 定时任务
  2. 网转 mm IOS 报表
  3. 实现接口与显示实现接口的区别
  4. 文献记录(part46)--Building Outlier Detection Ensembles by Selective Parameterization of ...
  5. 计算机二级web题目(7.4)--综合应用题1
  6. 三种方法求最长子序列问题
  7. CSS快速学习5:文本溢出和XHTML元素分类
  8. ping不通自己的ip地址_1000个IP地址同时怎么Ping,一个小技巧轻松搞定
  9. socket编程,简单查看
  10. canvas放射粒子效果
  11. 语音识别基本原理介绍之gmm-hmm续
  12. JAVA 如何反编译JAR文件
  13. 本科有计算机应用吗,计算机应用专业自考本科
  14. 软考真题———2018上
  15. 浩辰3D与SolidWorks之间的异同
  16. Python软件的下载安装教程
  17. 博弈论大作战之 PART1
  18. intel更新13代桌面处理器产品线,更多核心更贵价格
  19. 计算机专业招聘人才的需求,对计算机专业人才需求现状
  20. 【ct107d】蜂鸣器,继电器控制

热门文章

  1. 算法导论——优先队列(大到小)
  2. rpm 软件的安装和卸载
  3. LFS 安装笔记 (二)
  4. 存储 萤石云_同时用过小米米家智能猫眼(带屏)与萤石dp1s智能门铃之后的感受...
  5. 释疑の修改SAP标准表内容
  6. CL_GUI_PICTURE
  7. SAP SM12 解锁Lock Table
  8. Leave List-Processing 新解
  9. 高压线下,恶俗短视频为何仍在批量生产?
  10. “死”在拥挤赛道上的快递员工