我曾尝试阅读一些文章,但我对这些概念还不是很清楚.
有人愿意尝试向我解释这些技术是什么:
我每次遇到的一件事是,服务器保持连接打开并将数据推送到客户端.如何保持连接打开,客户端如何获取推送数据?(客户端如何使用数据,也许某些代码可能会有帮助?)
现在,我应该将其中哪一个用于实时应用.我一直听说很多关于websockets(有socket.io [一个node.js库]),但为什么不用PHP?
我正在为iOS游戏编写服务器.游戏是基于回合的,并且服务器将信息推送到客户端的唯一时间是通知对手的移动.
我很好奇是否有人可以评论使用websockets和长轮询之间的性能和易于实现的差异.另外,如果我使用websockets,我应该只使用它来接收信息并发送其他所有的POST请求,还是应该通过websocket进行所有通信?
另外,如果我有兴趣创建一个Web客户端,那么在websockets和长轮询之间还有什么需要考虑的吗?
我已经阅读了这个问题,但它并没有完全回答我的问题.不幸的是,自从我上次查看AJAX以来,看起来XHR对象中的内容发生了变化,因此responseText
在完成填充之前不再可以直接访问.
我必须编写一个使用AJAX(最好是jQuery,但我愿意接受建议)的页面来从我无法控制的服务器通过HTTP检索CSV数据.响应数据可能非常大; 一兆字节的文本并不少见.
服务器是流友好的.是否有任何方法可以直接从JavaScript返回数据流?
我可以选择编写一些生活在中间的PHP代码并使用某种"Comet"技术(长轮询,EventSource等),但我希望尽可能避免这种情况.
如果它是相关的,假设这个问题用户有最新版本的Firefox/Chrome/Opera和旧的浏览器兼容性不是问题.
我正在使用.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()
该函数的第一行返回,但这似乎完全杀死了加载屏幕.
任何想法如何实现这一目标?
我正在构建一个实时Web应用程序据我所知,最受欢迎的选择是短轮询和长轮询.测量一个优于另一个有什么优点和缺点?
我正在尝试第一次实现长轮询,并且我正在使用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秒的超时.实际上,补丁尝试修复的 …
如果有一个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原则?
Google云端硬盘使用什么技术进行实时操作?
当我输入多个用户正在访问的Google云端硬盘文档时,Chrome开发者工具网络标签显示没有WebSockets.
我看到两种最常见的AJAX调用类型都有"绑定"?还是"保存?" 在URL中."保存?" 每次输入时都会发出POST请求,这对于向服务器发送更新很有意义.
当另一个用户输入时,最近的"绑定?" GET呼叫保持打开状态,通过该连接传输的数据量也会增加.周期性地,"绑定?"被关闭,新的打开,逻辑似乎是持续时间和数据大小的一些功能.
这不是长轮询,因为当服务器发送更新时,它不会完成响应.
这似乎不是服务器发送的事件,因为内容类型是"text/plain"而不是"text/stream".
Google正在做什么名称?如果是这样,我该如何尝试实现呢?
另见" WCF通过防火墙推送到客户端 "
我需要一个连接到WCF服务器的WCF客户端,然后当服务器上的某些数据发生变化时,客户端需要更新其显示.
因为客户端和服务器之间可能存在防火墙.
当我写客户端和服务器时,我不需要将解决方案限制为仅使用肥皂等.
感谢Drew Marsh提供的关于如何在WCF中实现长轮询的最丰富的答案.但是我认为WCF的主要"卖点"是你可以通过配置在配置文件中使用的通道来做这种事情. 例如,我想要一个逻辑上只有两个但只是物理传入的频道.
我正在编写一个使用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) long-polling ×10
comet ×4
ajax ×3
websocket ×3
javascript ×2
jquery ×2
real-time ×2
rest ×2
.net ×1
http ×1
ios ×1
php ×1
polling ×1
wcf ×1
web-services ×1