php 通知客户端,PHP+SSE服务器向客户端推送消息
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服务器向客户端推送消息相关推荐
- android点击通知跳转到服务,Android 接收推送消息跳转到指定页面的方法
问题的提出 本次接入的是个推,其他家的推送没有研究过,思路应该是类似的 App在前台,这个时候需要弹出一个对话框,提醒用户有新的消息,是否要查看,查看的话跳转到指定页面 App在后台,或是App进程已 ...
- 服务器主动推送消息数据给客户端
1 引言 这个问题第一次是我在实现一个导师的方案的时候所发现的,一开始我需要实现服务器与客户端的密钥协商和数据传递,服务器需要主动分发(推送)密钥给客户端,因为以前没有做过相关编码,后来只能想到用反向 ...
- 服务器向客户端推送消息之——WebSocket详细使用
文章目录 1. 引言 2. WebSocket使用步骤 2.1 引入依赖 2.2 创建WebSocket配置类 2.3 WebSocket服务类 2.4 前端页面 1. 引言 最近遇到一个生活场景,需 ...
- web应用从服务器主动推送消息到客户端到方式
总结帖 为什么需要服务端向客户端推送消息? 在某些应用功能中,例如定位,游戏,社交消息的推送等,用户都是被动接受u消息的,为了处理这类问题,需要服务端向客户端推送消息. 引言: 普通情况下,有客户端向 ...
- asp服务器推送消息,asp.net实时向客户端推送消息(SignalRWeb)
[实例简介]ASP.net中服务器端向客户端推送消息,多用于在线聊天 [实例截图] [核心代码] using System; using System.Collections.Generic; usi ...
- nett服务器接收消息的方法,C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用...
C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用 运行效果: 1.安装Microsoft.AspNetCore.Signa ...
- DWR实现服务器端向客户端推送消息
2019独角兽企业重金招聘Python工程师标准>>> 1.简介 DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框 ...
- 服务端如何推送消息给客户端?
大家好,我是前端西瓜哥,今天带大家了解一下服务端如何推送消息给客户端. 有时候,我们希望服务端能够主动推送一些信息给客户端.但 HTTP 协议只能让客户端发起请求然后服务端响应,而无法让服务端主动去发 ...
- Asp.net webApi 通过WebSocket推送消息给客户端,搭建一个即是服务端又是客户端的服务
Asp.net webApi 通过WebSocket推送消息给客户端,搭建一个即是服务端又是客户端的服务_IT_ziliang的博客-CSDN博客 WebSocket是一种在单个TCP连接上进行全双工 ...
最新文章
- linux 定时任务
- 网转 mm IOS 报表
- 实现接口与显示实现接口的区别
- 文献记录(part46)--Building Outlier Detection Ensembles by Selective Parameterization of ...
- 计算机二级web题目(7.4)--综合应用题1
- 三种方法求最长子序列问题
- CSS快速学习5:文本溢出和XHTML元素分类
- ping不通自己的ip地址_1000个IP地址同时怎么Ping,一个小技巧轻松搞定
- socket编程,简单查看
- canvas放射粒子效果
- 语音识别基本原理介绍之gmm-hmm续
- JAVA 如何反编译JAR文件
- 本科有计算机应用吗,计算机应用专业自考本科
- 软考真题———2018上
- 浩辰3D与SolidWorks之间的异同
- Python软件的下载安装教程
- 博弈论大作战之 PART1
- intel更新13代桌面处理器产品线,更多核心更贵价格
- 计算机专业招聘人才的需求,对计算机专业人才需求现状
- 【ct107d】蜂鸣器,继电器控制