我曾尝试阅读一些文章,但我对这些概念还不是很清楚.
有人愿意尝试向我解释这些技术是什么:
我每次遇到的一件事是,服务器保持连接打开并将数据推送到客户端.如何保持连接打开,客户端如何获取推送数据?(客户端如何使用数据,也许某些代码可能会有帮助?)
现在,我应该将其中哪一个用于实时应用.我一直听说很多关于websockets(有socket.io [一个node.js库]),但为什么不用PHP?
双方的WebSockets和服务器发送的事件能够将数据推送到浏览器.对我来说,他们似乎是竞争技术.他们之间有什么区别?你何时会选择一个而不是另一个?
所有,
HTML5 Rocks有一个很好的关于服务器发送事件(SSE)的初学者教程:
http://www.html5rocks.com/en/tutorials/eventsource/basics/
但是,我不明白一个重要的概念 - 什么触发服务器上导致消息发送的事件?
换言之-在HTML5例如-服务器仅仅发送时间戳一次:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
function sendMsg($id, $msg) {
echo "id: $id" . PHP_EOL;
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
Run Code Online (Sandbox Code Playgroud)
如果我正在构建一个实际的例子 - 例如,Facebook风格的"墙"或股票代码,其中服务器会在每次某些数据更改时将"新信息""推送"到客户端,这是如何工作的?
换句话说...... PHP脚本是否有一个连续运行的循环,检查数据的变化,然后每次发现一个消息时发送一条消息?如果是这样 - 你怎么知道何时结束这个过程?
或者 - PHP脚本是否只是发送消息,然后结束(如HTML5Rocks示例中的情况)?如果是这样 - 您如何获得持续更新?浏览器是否只是定期轮询PHP页面?如果是这样 - 那是一个"服务器发送的事件"?这与使用AJAX定期调用PHP页面的JavaScript中编写setInterval函数有什么不同?
对不起 - 这可能是一个非常天真的问题.但是我找不到的例子都没有说清楚.
[UPDATE]
我认为我的问题措辞不多,所以这里有一些澄清.
假设我有一个网页,应该显示Apple股票的最新价格.
当用户首次打开页面时,该页面会创建一个EventSource,其URL为我的"stream".
var source = new EventSource('stream.php');
Run Code Online (Sandbox Code Playgroud)
我的问题是 - …
在HTML5 SSE和直接的Ajax轮询之间是否存在很大差异(在性能,浏览器实现可用性,服务器负载等方面)?从服务器端看,它似乎EventSource只是每隔约3秒左右点击指定的页面(虽然我知道时间是灵活的).
当然,在客户端设置比设置定时器并且$.get经常使用它更简单,但还有其他什么吗?它会发送更少的标题,还是做其他一些我不知道的魔法?
html5 server-side javascript-events ajax-polling server-sent-events
所以我理解服务器发送事件的概念(EventSource):
EventSource我很困惑的是它在服务器上是如何工作的.我看了一下不同的例子,但想到的一个是Mozilla的:http://hacks.mozilla.org/2011/06/a-wall-powered-by-eventsource-and-server-sent-事件/
现在这可能只是一个不好的例子,但是根据我的理解,服务器端如何工作有点有道理:
那有意义吗?从准确的角度来看,它真的是如何运作的吗?
我正在使用HTML5 Server-Sent Events,如下所示:
SSEUpdate = new EventSource("http://example.com/update.php");
SSEUpdate.onmessage = function(e){
console.log(e.data);
}
Run Code Online (Sandbox Code Playgroud)
它在IE11中不起作用.(控制台出错:)'EventSource' is undefined是否有相同的Microsoft等价物,或者我必须做一些完全不同的事情?
html5 internet-explorer server-sent-events internet-explorer-11
Google云端硬盘使用什么技术进行实时操作?
当我输入多个用户正在访问的Google云端硬盘文档时,Chrome开发者工具网络标签显示没有WebSockets.
我看到两种最常见的AJAX调用类型都有"绑定"?还是"保存?" 在URL中."保存?" 每次输入时都会发出POST请求,这对于向服务器发送更新很有意义.
当另一个用户输入时,最近的"绑定?" GET呼叫保持打开状态,通过该连接传输的数据量也会增加.周期性地,"绑定?"被关闭,新的打开,逻辑似乎是持续时间和数据大小的一些功能.
这不是长轮询,因为当服务器发送更新时,它不会完成响应.
这似乎不是服务器发送的事件,因为内容类型是"text/plain"而不是"text/stream".
Google正在做什么名称?如果是这样,我该如何尝试实现呢?
我有一个侦听Server Sent Events的Web应用程序.当我在打开多个窗口的时候工作和测试时,事情不起作用,我多次朝着错误的方向猛击头脑:最终,我意识到问题是并发连接.
但是我测试的数量非常有限,即使我在Apache上运行测试(我知道,我应该使用node).
然后,我切换浏览器并注意到一些非常有趣的东西:显然Chrome将Server Sent Events连接限制为4-5,而Opera则没有.另一方面,Firefox连同4-5个连接后,拒绝加载任何其他页面.
这背后的原因是什么?限制仅适用于来自同一来源的SSE连接,或者如果我要测试从其他域打开它们,它是否会相同?我是否有可能滥用SSE,这实际上阻止了浏览器,或者这是一种已知的行为?它有什么办法吗?
javascript opera google-chrome cross-browser server-sent-events
我目前正在进行一项使用Server-Sent Events接收消息的聊天.但是,我遇到了一个问题.服务器发送的事件从未连接并保持挂起状态,因为页面未加载.
例如:
<?php
while(true) {
echo "data: This is the message.";
sleep(3);
ob_flush();
flush();
}
?>
Run Code Online (Sandbox Code Playgroud)
我希望每隔3秒,"数据:这就是消息." 将被输出.相反,页面只是不加载.但是,对于服务器发送的事件,我需要这种行为.有没有办法来解决这个问题?
编辑:
完整代码:
<?php
session_start();
require "connect.php";
require "user.php";
session_write_close();
echo $data["number"];
header("Content-Type: text/event-stream\n\n");
header('Cache-Control: no-cache');
set_time_limit(1200);
$store = new StdClass(); // STORE LATEST MESSAGES TO COMPARE TO NEW ONES
$ms = 200; // REFRESH TIMING (in ms)
$go = true; // MESSAGE CHANGED
function formateNumber ($n) {
$areaCode = substr($n, 0, 3);
$part1 = substr($n, 3, 3);
$part2 = substr($n, 6, …Run Code Online (Sandbox Code Playgroud) 我一直在开发一个nodejs服务器,为我在HTML5中开发的新网站提供服务器端事件.
当我telnet到服务器它正常工作,向我发送所需的HTTP响应标头,然后是我目前每2或3秒生成一次事件流,以证明它的工作原理.
我已经尝试了最新版本的FireFox,Chrome和Opera,他们创建了EventSource对象并连接到nodejs服务器,但是没有一个浏览器生成任何事件,包括onopen,onmessage和onerror.
但是,如果我停止我的nodejs服务器,终止与浏览器的连接,他们都会突然发送所有消息,并显示我的所有事件.然后浏览器都按照规范尝试重新连接到服务器.
我在网络服务器上托管所有内容.没有在本地文件中运行.
我已经阅读了我在网上找到的所有内容,包括我购买的书籍,没有任何迹象表明存在此类问题.我有什么遗失的东西吗?
示例服务器实现
var http = require('http');
var requests = [];
var server = http.Server(function(req, res) {
var clientIP = req.socket.remoteAddress;
var clientPort = req.socket.remotePort;
res.on('close', function() {
console.log("client " + clientIP + ":" + clientPort + " died");
for(var i=requests.length -1; i>=0; i--) {
if ((requests[i].ip == clientIP) && (requests[i].port == clientPort)) {
requests.splice(i, 1);
}
}
});
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Access-Control-Allow-Origin': '*',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'});
requests.push({ip:clientIP, port:clientPort, res:res});
res.write(": connected.\n\n");
});
server.listen(8080); …Run Code Online (Sandbox Code Playgroud) html5 ×4
php ×3
websocket ×3
javascript ×2
long-polling ×2
ajax-polling ×1
comet ×1
node.js ×1
opera ×1
real-time ×1
server-side ×1