标签: server-sent-events

什么是长轮询,Websockets,服务器发送事件(SSE)和Comet?

我曾尝试阅读一些文章,但我对这些概念还不是很清楚.

有人愿意尝试向我解释这些技术是什么:

  1. 长轮询
  2. 服务器发送的事件
  3. 的WebSockets
  4. 彗星

我每次遇到的一件事是,服务器保持连接打开并将数据推送到客户端.如何保持连接打开,客户端如何获取推送数据?(客户端如何使用数据,也许某些代码可能会有帮助?)

现在,我应该将其中哪一个用于实时应用.我一直听说很多关于websockets(有socket.io [一个node.js库]),但为什么不用PHP?

php comet long-polling websocket server-sent-events

1005
推荐指数
4
解决办法
17万
查看次数

WebSockets与服务器发送的事件/事件源

双方的WebSockets服务器发送的事件能够将数据推送到浏览器.对我来说,他们似乎是竞争技术.他们之间有什么区别?你何时会选择一个而不是另一个?

html5 websocket server-sent-events

780
推荐指数
7
解决办法
19万
查看次数

服务器发送的事件和php - 什么触发服务器上的事件?

所有,

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)

我的问题是 - …

php server-sent-events

84
推荐指数
2
解决办法
4万
查看次数

服务器发送的事件与轮询

HTML5 SSE和直接的Ajax轮询之间是否存在很大差异(在性能,浏览器实现可用性,服务器负载等方面)?从服务器端看,它似乎EventSource只是每隔约3秒左右点击指定的页面(虽然我知道时间是灵活的).

当然,在客户端设置比设置定时器并且$.get经常使用它更简单,但还有其他什么吗?它会发送更少的标题,还是做其他一些我不知道的魔法?

html5 server-side javascript-events ajax-polling server-sent-events

57
推荐指数
2
解决办法
2万
查看次数

服务器发送的事件如何实际工作?

所以我理解服务器发送事件的概念(EventSource):

  • 客户端通过端口连接到端点 EventSource
  • 客户端只监听从端点发送的消息

我很困惑的是它在服务器上是如何工作的.我看了一下不同的例子,但想到的一个是Mozilla的:http://hacks.mozilla.org/2011/06/a-wall-powered-by-eventsource-and-server-sent-事件/

现在这可能只是一个不好的例子,但是根据我的理解,服务器端如何工作有点有道理:

  • 数据存储区中的某些更改,例如数据库
  • 服务器端脚本每隔N秒轮询数据存储区
  • 如果轮询脚本注意到更改,则会向客户端触发服务器发送的事件

那有意义吗?从准确的角度来看,它真的是如何运作的吗?

server-sent-events

41
推荐指数
2
解决办法
9814
查看次数

是否有Microsoft等效的HTML5 Server-Sent Events?

我正在使用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

39
推荐指数
1
解决办法
3万
查看次数

Google云端硬盘使用什么技术来获取实时更新?

Google云端硬盘使用什么技术进行实时操作?

当我输入多个用户正在访问的Google云端硬盘文档时,Chrome开发者工具网络标签显示没有WebSockets.

我看到两种最常见的AJAX调用类型都有"绑定"?还是"保存?" 在URL中."保存?" 每次输入时都会发出POST请求,这对于向服务器发送更新很有意义.

当另一个用户输入时,最近的"绑定?" GET呼叫保持打开状态,通过该连接传输的数据量也会增加.周期性地,"绑定?"被关闭,新的打开,逻辑似乎是持续时间和数据大小的一些功能.

这不是长轮询,因为当服务器发送更新时,它不会完成响应.

这似乎不是服务器发送的事件,因为内容类型是"text/plain"而不是"text/stream".

Google正在做什么名称?如果是这样,我该如何尝试实现呢?

Chrome开发者工具 - 修改Google云端硬盘文档

real-time long-polling websocket server-sent-events

34
推荐指数
2
解决办法
5176
查看次数

服务器发送事件和浏览器限制

我有一个侦听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

23
推荐指数
3
解决办法
8929
查看次数

虽然服务器发送事件的循环导致页面冻结

我目前正在进行一项使用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)

php server-sent-events

23
推荐指数
4
解决办法
4208
查看次数

JavaScript EventSource SSE未在浏览器中触发

我一直在开发一个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)

javascript html5 node.js server-sent-events

22
推荐指数
1
解决办法
1万
查看次数