标签: long-polling

什么是长轮询,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和长轮询之间的差异

我正在为iOS游戏编写服务器.游戏是基于回合的,并且服务器将信息推送到客户端的唯一时间是通知对手的移动.

我很好奇是否有人可以评论使用websockets和长轮询之间的性能和易于实现的差异.另外,如果我使用websockets,我应该只使用它来接收信息并发送其他所有的POST请求,还是应该通过websocket进行所有通信?

另外,如果我有兴趣创建一个Web客户端,那么在websockets和长轮询之间还有什么需要考虑的吗?

rest web-services long-polling websocket ios

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

jQuery逐步读取AJAX流?

我已经阅读了这个问题,但它并没有完全回答我的问题.不幸的是,自从我上次查看AJAX以来,看起来XHR对象中的内容发生了变化,因此responseText在完成填充之前不再可以直接访问.

我必须编写一个使用AJAX(最好是jQuery,但我愿意接受建议)的页面来从我无法控制的服务器通过HTTP检索CSV数据.响应数据可能非常大; 一兆字节的文本并不少见.

服务器是流友好的.是否有任何方法可以直接从JavaScript返回数据流?

我可以选择编写一些生活在中间的PHP代码并使用某种"Comet"技术(长轮询,EventSource等),但我希望尽可能避免这种情况.

如果它是相关的,假设这个问题用户有最新版本的Firefox/Chrome/Opera和旧的浏览器兼容性不是问题.

ajax jquery javascript-events long-polling http-streaming

70
推荐指数
4
解决办法
7万
查看次数

为特定请求禁用ajaxStart()和ajaxStop()

我正在使用.ajaxStart()和.ajaxStop()在发出ajax请求时显示模态.(开始和停止之间)

现在我想添加一个等待通知的longpoll函数,类似于本网站左上角的那个.

我现在的问题在于仅为longpolling请求禁用此模式.

注册"加载屏幕"打开和关闭处理程序:

$(document).ajaxStart(handleAjaxStart);
$(document).ajaxStop(handleAjaxStop);
Run Code Online (Sandbox Code Playgroud)

我的longpoll功能:

$.ajax({
    timeout: 35000,
    url: longPollUrl,
    success: function(data){
        if(data.queCount) $('#numQueCount').html(data.queCount);
        if(data.queAccept) $('#numQueAccept').html(data.queAccept);
    }, 
    dataType: 'json',
    complete: longpoll
});
Run Code Online (Sandbox Code Playgroud)

我试过了:

$().off('ajaxStart');
$().off('ajaxStop');
Run Code Online (Sandbox Code Playgroud)

..开始投票后重新连接处理程序,但没有快乐.

我也尝试将一个全局变量引入到handleAjaxStart()该函数的第一行返回,但这似乎完全杀死了加载屏幕.

任何想法如何实现这一目标?

ajax jquery long-polling

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

实时Web应用程序的短轮询与长轮询?

我正在构建一个实时Web应用程序据我所知,最受欢迎的选择是短轮询和长轮询.测量一个优于另一个有什么优点和缺点?

javascript comet http real-time long-polling

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

当对同一资源发出多个请求时,Chrome会停止?

我正在尝试第一次实现长轮询,并且我正在使用XMLHttpRequest对象来执行它.到目前为止,我已经成功地在Firefox和Internet Explorer 11中获取了活动,但Chrome奇怪的是这次奇怪的是.

我可以加载一个页面,它运行得很好.它立即发出请求并开始处理和显示事件.如果我在第二个选项卡中打开页面,其中一个页面开始看到接收事件的延迟.在开发工具窗口中,我看到了这种时序的多个请求:

截图

"停滞"将持续长达20秒.它不会发生在每个请求上,但通常会连续发生在多个请求中,并且会出现在一个选项卡中.

起初我认为这是我的服务器的问题,但后来我打开了两个IE选项卡和两个Firefox选项卡,它们都连接并接收相同的事件而不会停止.只有Chrome遇到这种麻烦.

我认为这可能是我正在制作或提供请求的方式的问题.作为参考,请求标头如下所示:

Connection: keep-alive
Last-Event-Id: 530
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
Accept: */*
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Run Code Online (Sandbox Code Playgroud)

响应如下:

HTTP/1.1 200 OK
Cache-Control: no-cache
Transfer-Encoding: chunked
Content-Type: text/event-stream
Expires: Tue, 16 Dec 2014 21:00:40 GMT
Server: Microsoft-HTTPAPI/2.0
Date: Tue, 16 Dec 2014 21:00:40 GMT
Connection: close
Run Code Online (Sandbox Code Playgroud)

尽管涉及到标题,但我没有使用浏览器的原生EventSource,而是使用polyfill来设置其他标题.polyfill正在使用XMLHttpRequest,但在我看来,无论请求是如何进行的,它都不应该停顿20秒.

什么可能导致Chrome像这样失速?

编辑: Chrome的chrome:// net-internals /#events页面显示涉及超时错误:

t=33627 [st=    5]      HTTP_CACHE_ADD_TO_ENTRY  [dt=20001]
                --> net_error = -409 (ERR_CACHE_LOCK_TIMEOUT)
Run Code Online (Sandbox Code Playgroud)

错误消息是指六个月前添加到Chrome的补丁(https://codereview.chromium.org/345643003),当多次请求同一资源时,该补丁实现了20秒的超时.实际上,补丁尝试修复的 …

google-chrome long-polling google-chrome-devtools

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

什么是监视REST资源以进行更改的RESTful方法?

如果有一个REST资源我想要监视来自其他客户端的更改或修改,那么最好的(也是最RESTful)方式是什么?

我这样做的一个想法是提供特定的资源来保持连接打开,而不是在资源不存在的情况下立即返回.例如,给定资源:

/game/17/playerToMove
Run Code Online (Sandbox Code Playgroud)

这个资源上的"GET"可能会告诉我轮到我的对手了.我可能会注意到移动号码(比如5)并试图检索下一步行动,而不是不断地轮询这个资源以找出轮到我移动的时间:

/game/17/move/5
Run Code Online (Sandbox Code Playgroud)

在"正常"REST模型中,似乎对此URL的GET请求将返回404(未找到)错误.但是,如果相反,服务器保持连接打开,直到我的对手发挥他的移动,即:

PUT /game/17/move/5
Run Code Online (Sandbox Code Playgroud)

然后服务器可以将我的对手PUT的内容返回到该资源.这将为我提供我需要的数据,以及一种通知我的对手何时移动而不需要轮询.

这种方案是RESTful吗?或者它违反了某种REST原则?

rest polling long-polling

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

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
查看次数

WCF服务器如何通知WCF客户端有关更改?(更好的解决方案然后简单的轮询,例如Comet或长轮询)

另见" WCF通过防火墙推送到客户端 "

我需要一个连接到WCF服务器的WCF客户端,然后当服务器上的某些数据发生变化时,客户端需要更新其显示.

因为客户端和服务器之间可能存在防火墙.

  • 所有通信都必须通过HTTP
  • 服务器无法对客户端进行(物理)传出呼叫.

当我写客户端和服务器时,我不需要将解决方案限制为仅使用肥皂等.


我正在寻找" 长期投票 "/" 彗星 "等的内置支持


感谢Drew Marsh提供的关于如何在WCF中实现长轮询的最丰富的答案.但是我认为WCF的主要"卖点"是你可以通过配置在配置文件中使用的通道来做这种事情. 例如,我想要一个逻辑上只有两个但只是物理传入的频道.

.net wcf design-patterns comet long-polling

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

Chrome的加载指示器在XMLHttpRequest期间保持旋转

我正在编写一个使用Comet/Long Polling来保持网页最新的AJAX网络应用程序,我注意到在Chrome中,它会将页面视为始终加载(标签图标不断旋转).

我认为这对谷歌Chrome + Ajax来说是正常的,因为即使Google Wave也有这种行为.

那么今天我注意到Google Wave不再保持加载图标旋转,任何人都知道他们如何解决这个问题?

这是我的ajax调用代码

var xmlHttpReq = false;
// Mozilla/Safari
if (window.XMLHttpRequest) {
   xmlHttpReq = new XMLHttpRequest();
}
// IE
else if (window.ActiveXObject) {
   xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttpReq.open('GET', myURL, true);
xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlHttpReq.onreadystatechange = function() {
   if (xmlHttpReq.readyState == 4) {
      updatePage(xmlHttpReq.responseText);
   }
}
xmlHttpReq.send(null);
Run Code Online (Sandbox Code Playgroud)

javascript ajax google-chrome comet long-polling

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