标签: server-sent-events

当Eric Hynds的JQuery Multiselect UI选择框动态更新时,会自动选择第一个选项

我使用http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/的JQuery UI multiselect插件动态地将元素附加到选择框

//Make filter cars multiselect
$("#cars_filter").multiselect({noneSelectedText:'Select cars'});

function populateCarfilter(){
    var opts="<option value=''>Select cars</option>";
    $.each(markers, function(idx, mar){
      if(mar.getVisible() && mar.get("car"))
     opts+="<option value='" + mar.get("id") + "'>" + mar.get("driver") + " - " + mar.get("car") + "</option>";
    });

    if($("#cars_filter").html()!=opts){
      var id = $("#cars_filter").val()
      $("#cars_filter").html(opts);
      $("#cars_filter").val(id);
      $("#cars_filter").multiselect('refresh');
    }    
}

populateCarfilter(); //This gets called every 2 secs automatically by SSE (server sent events)
Run Code Online (Sandbox Code Playgroud)

现在,我面临一个奇怪的问题.每次更新选择框时,都会自动选择选择框中的第一个选项.有什么方法可以解决这个问题?

谢谢

javascript jquery jquery-ui server-sent-events

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

SSE(EventSource):为什么不超过6个连接?

在重载我的机器之前,我想看看我可以设置多少同步SSE(也称为EventSource)连接.但是使用Firefox(Firefox 18或Firefox 20)测试它在6个连接处停止:附加连接没有错误,但不发送任何数据.(在Firebug中,我可以在那里看到它们,等待连接.)Chromium 25也在6个连接处停止,Opera 12.15也是如此.但它似乎不是服务器端限制(我使用Apache + PHP),因为我可以同时运行所有三个浏览器(即18个连接),并且所有都来自相同的IP地址.(服务器和客户端位于同一台计算机上,但使用的是172.16.xx地址,而不是127.0.0.1.)

所以,我用CORS设置测试,并尝试连接到另一台具有全局IP的服务器.这次我获得了12个Firefox连接.建议它毕竟是Apache配置?不,Opera仍然只有6个连接.(Chrome没有号码,因为CORS似乎不起作用.)我也可以连接两台服务器,在Firefox中共有18个连接(但从不再连接),在Opera中共有12个连接.

作为第三个测试,我将后端和html移动到远程服务器,并以这种方式加载页面.这次我达到了Firefox的10个连接限制!?!Opera仍然有6的限制.而Chromium(由于这次没有涉及CORS,因此有效)限制为6.

我很欣赏任何关于这个数字6来自哪里的见解,以及所有三个浏览器是否相同的巧合.特别是任何洞察Firefox为何有时为6,有时为10,有时为12.(SSE规范似乎未定义最大连接数.)


Apache配置是使用prefork,这意味着这些设置:

StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients          150
MaxRequestsPerChild   0
Run Code Online (Sandbox Code Playgroud)

(本地(Ubuntu 10.04)和全局(Ubuntu 11.10)服务器在这里具有相同的Apache设置.)我认为关键数字是MaxClients是150.我做了一个快速实验,将StartServers更改为50而不是5,但是相同结果.


这是客户端HTML/javascript(1或2行取消注释,如果你想实验连接到不同的服务器那么修改;如这里给出的,它希望在与HTML相同的目录中找到sse.php):

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>SSE Stresstest</title>
</head>
<body>
<p id="err"></p>
<p id="x"></p>
<script>
function start(){

function onMessage(e){
document.getElementById('x').innerHTML+=e.origin+":"+this.dummy_n+":"+e.data+"<br/>";
};

function onError(e){
document.getElementById('err').innerHTML+="ERR:"+this.dummy_n+":"+JSON.stringify(e)+"<br/>";
};

for(var n=1;n<=32;++n){
    //NB. 't' primarily to avoid caching
    var url='sse.php?dummy_n='+n+'&t='+(new Date().getTime());
    //if(n%2==0)
    //    url='http://example.com/sse.php?dummy_n='+n+'&t='+(new Date().getTime());
    var es=new EventSource(url);
    es.dummy_n=n;   //So we can identify each one
    es.addEventListener('error',onError,false);
    es.addEventListener('message',onMessage,false); …
Run Code Online (Sandbox Code Playgroud)

apache firefox opera google-chrome server-sent-events

11
推荐指数
1
解决办法
7702
查看次数

服务器发送事件和Rails流

我正在尝试使用Rails 4 ActionController::Live和Server Sent Events.我正在使用MRI 2.0.0和Puma.

我可以看到,每个连接的客户端都保持与服务器的活动连接.我想知道是否可以在不保持所有响应流运行的情况下利用SSE.

Puma使用线程管理多个连接,我想cuncurrent连接的数量是有限的.
如果我想支持数以千计的客户注册到我的Rails应用程序进行SSE事件的真实场景,该怎么办?

有什么例子吗?

此外,我通常在nginx反向代理后面运行Rails应用程序服务器.它需要任何特定的设置吗?

ruby ruby-on-rails nginx server-sent-events puma

11
推荐指数
1
解决办法
1408
查看次数

使用HTML5 EventSource将CZML流式传输到Cesium中

我目前正在研究使用Cesium作为个人项目数据可视化的方式,实时更新将是一件很棒的事情.

阅读wiki,我发现本节概述了如何使用HTML EventSource API完成动态更新Cesium中的对象.

我在Node.js中编写了一个相当简单的服务器,它创建了text/event-stream一个定期发送对象位置更新的服务器.这部分工作正常,我可以成功连接并将此数据记录到控制台.

我的问题在于铯.我花了几个小时挖掘文档(Github wiki和下载中包含的JSDoc文档),我无法弄清楚如何将我的CZML添加到全球.使用随源代码提供的Cesium Viewer应用程序,我可以看到如何从本地和远程资源加载CZML文件,但我无法弄清楚如何修改这种方法来摄取来自EventSource事件的CZML数据包.

我的CZML数据包示例:

{
  'id': 'myObject',
  'availability': '2014-01-15T00:00Z/2014-01-01T24:00Z',
  'point': {
    'color': {
      'rgba': [255, 255, 0, 255]
    },
    'outlineWidth': 2.0,
    'pixelSize': 3.0,
    'show': true
  },
  'position': {
    'cartesian': [0.0, -2957000.0, -840000.0, 5581000.0],
    'epoch': '2014-01-01T00:00Z',
    'interpolationAlgorithm': 'LINEAR',
    'interpolationDegree': 1
  }
}
Run Code Online (Sandbox Code Playgroud)

我目前的做法如下:

var czmlStream;
var czmlStreamUrl = 'http://127.0.0.1:8080/czml-stream';

viewer.dataSources.add(czmlStream);

var czmlEventSource = new EventSource(czmlStreamUrl);
czmlEventSource.addEventListener('czml', function(czmlUpdate) {
  czmlStream.load(JSON.parse(czmlUpdate.data));
}, false);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.我基于如何加载静态CZML文件:

var source;
var sourceURL = 'http://127.0.0.1/czml-static.czml';

source.loadUrl(sourceURL).then(function() {
  viewer.dataSources.add(source);
} …
Run Code Online (Sandbox Code Playgroud)

javascript html5 server-sent-events cesium

11
推荐指数
1
解决办法
4193
查看次数

服务器为每个客户端发送事件,Puma,Rails和最大专用线程

我正在使用Redis for我的rails项目订阅频道并在事件发生时发布到这些频道.在客户端,我正在注册与这些频道对应的EventSource.每当服务器上的订阅频道发生事件时,服务器执行SSE写入,以便所有已注册的客户端都接收更新.

现在,与订阅这些通道的每个客户端的服务器连接保持活动状态,即专用于此客户端的服务器线程一直运行,直到客户端断开连接.使用这种方法,如果有1000个并发用户订阅了一个频道,我将打开1000个TCP/IP连接.

我正在使用Puma作为本教程中建议的Web服务器.Puma默认指定16个最大线程.我可以将此限制更改为更高的限制.

我可能不知道我的应用程序中一次可能有多少并发用户,并且不知道最大值是多少.我可以在Puma中指定的线程数.在最坏的情况下,如果专用于每个并发用户的线程数达到为Puma网络服务器指定的线程的最大计数,则应用程序将冻结所有用户,直到其中一个并发用户断开连接.

我很高兴使用Rails实时流,并且服务器在我的rails项目中发送了事件,但是使用这种方法我有可能达到我的Web服务器中指定的最大线程的限制,因此应用程序对所有用户都没有响应,直到其中一个并发用户断开连接.

不确定Puma对于大型并发用户群的典型最大线程数是多少.

我应该考虑其他方法 - 可能是基于ajax的轮询或使用事件驱动的非阻塞I/O模型的Node.js?或者只是运行一些基准来了解我的最大线程数是多少?

concurrency multithreading ruby-on-rails server-sent-events puma

11
推荐指数
1
解决办法
1558
查看次数

服务器发送事件vs Web套接字?

我正在开发一个网络应用程序,用户可以通过从智能手机到桌面的多个平台访问这些应用程序,有时需要在两个客户端之间进行通信,例如,如果我希望我的朋友加入我的网络,我会向他发送朋友请求但是我希望我的朋友能够看到该请求而无需刷新页面.

在这种情况下,这将是一个更好的选择?此外,我希望这个可以在尽可能多的平台和浏览器上工作,这些平台和浏览器有更多的浏览器支持?有更好的选择吗?

javascript websocket server-sent-events

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

使用Spring的DeferredResult进行长轮询

客户端定期调用异步方法(长轮询),向其传递一个股票代码的值,服务器使用该值来查询数据库并将对象返回给客户端.

我正在使用Spring的DeferredResult类,但是我不熟悉它的工作原理.请注意我如何使用symbol属性(从客户端发送)来查询数据库以获取新数据(见下文).

也许有更好的方法用于Spring的长轮询?

如何将symbol属性从方法deferredResult()传递给processQueues()

    private final Queue<DeferredResult<String>> responseBodyQueue = new ConcurrentLinkedQueue<>();

    @RequestMapping("/poll/{symbol}")
    public @ResponseBody DeferredResult<String> deferredResult(@PathVariable("symbol") String symbol) {
        DeferredResult<String> result = new DeferredResult<String>();
        this.responseBodyQueue.add(result);
        return result;
    }

    @Scheduled(fixedRate=2000)
    public void processQueues() {
        for (DeferredResult<String> result : this.responseBodyQueue) {
           Quote quote = jpaStockQuoteRepository.findStock(symbol);
            result.setResult(quote);
            this.responseBodyQueue.remove(result);
        }
    }
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc long-polling http-streaming server-sent-events

11
推荐指数
1
解决办法
7938
查看次数

带有附加Cookie的Server Sent Event Client

我正在尝试使用额外的cookie对Server Sent Event资源进行单元测试.我已经在为客户端使用Jersey作为EventSource和JavaX.以下代码工作正常:

    WebTarget target = ClientBuilder.newBuilder()
        .register(SseFeature.class)
        .build()
        .target("http://localhost:8080/sse");
    EventSource eventSource = EventSource.target(target).build();
    EventListener listener = new EventListener() {
        @Override
        public void onEvent(InboundEvent inboundEvent) {
            LOG.info(inboundEvent.readData(String.class));
        }
    };
    eventSource.register(listener);
    eventSource.open();
    serverEventManager.send("/sse", "foo");
    eventSource.close();
Run Code Online (Sandbox Code Playgroud)

Hoewever,对于额外的单元测试,我需要在请求中添加额外的cookie.我已经尝试了以下内容

target.(...).request.cookie("foo", "bar");
Run Code Online (Sandbox Code Playgroud)

但是这会返回一个构建器,我无法从中为EventSource创建所需的WebTarget.

java cookies junit server-sent-events jersey-2.0

11
推荐指数
1
解决办法
1699
查看次数

EventSource 的响应的 MIME 类型(“text/html”)不是“text/event-stream”。正在中止连接。标头设置为文本/事件流

您好,我使用 sse 在控制台中收到此错误

EventSource 的响应的 MIME 类型(“text/html”)不是“text/event-stream”。正在中止连接。

js代码是:

if (typeof(EventSource) !== "undefined") 
{
    var source = new EventSource("../api/updateWellData.php?uid=<?php echo $node_id ?>");
    source.onmessage = function(event) {
        var response = JSON.parse(event.data);
        document.getElementById("result").innerHTML = response.test;
        // some code like the above line
    };
}  
else 
{
    // refresh the page every 30 secs
} 
Run Code Online (Sandbox Code Playgroud)

PHP 代码是:

header('Cache-Control: no-cache');
header("Access-Control-Allow-Origin: *");
header("Content-Type: text/event-stream");

require_once("../resources/config.php");

if (isset($_GET['uid']))
{
    $uid = $_GET['uid'];
    while (1) 
    {
        $query = Query("SELECT * FROM well_data_last WHERE well_detail_id = $uid");
        $result …
Run Code Online (Sandbox Code Playgroud)

javascript php server-sent-events

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

对于 10,000 个用户的聊天室,websocket 和服务器发送事件 (SSE) 之间的性能差异?

SSE基于HTTP协议,ws需要进行一次HTTP升级。

据我所知,对于较小的用户群来说,WebSocket 比 SSE 好太多了。

我担心10000个用户的聊天系统会有多大差别。这里主要关心的是:

对于WebSocket,我必须运行 10,000 个连接的循环,以便每次收到新消息时发出一条消息。

对于SSE来说,没有循环,只有一个服务器发送的事件将数据流式传输给 10,000 个用户。

对我来说,从纸面上看,SSE 似乎最适合如此大的数量,特别是当连接的客户端数量不断增加到 20,000、100,000 时。不会为每条新消息运行 10,000 个值循环。

实际上也是如此吗?我尝试搜索一些 WebSocket 与 SSE 的性能基准,但没有找到。

请确认,SSE 是否比 WebSocket 具有更好的性能和更低的服务器资源利用率,用于向如此大的数字发送/流式传输消息。用户数?

websocket server-sent-events

10
推荐指数
1
解决办法
8624
查看次数