Javascript:每个客户端有两个连接
Javascript: two connections per client?
我正在开发一个实现长轮询的应用程序,因为我希望用户在通知到达时立即收到通知。我有这部分工作,但我也需要扩展这与javascript函数发送一个"心跳"到服务器每20秒。
我的问题:我如何做到这一点,而不完全中断代码20秒(使其他javascript仍然执行,而它的计数),有没有办法使用第二个连接?因为我不希望当心跳发送给用户时,我的长轮询被中断。
任何想法?
虽然下面的线程相当旧,但它表明浏览器允许在任何时候通过XMLHttpRequest进行多个连接。
在流行的浏览器中允许多少并发AJAX (XmlHttpRequest)请求?如果您使用XMLHttpRequest或任何其他实现comet的方式有一个很长的轮询会话,您仍然可以创建另一个请求到同一服务器,作为setInterval或setTimeout函数的一部分,直到您达到浏览器施加的有限限制,您需要确保的是在XHR的构造中包含异步标志:
var heartbeatXhr = new XMLHttpRequest();
heartbeatXhr.open('GET', '/polling-url', true); // true for asynchronous
使用setInterval(yourHearbeatFunction, 20000)
,它不会锁定Javascript执行线程。因此,长轮询请求将在它到来时立即处理。
您不需要为要实现的目标维护多个连接。Javascript的异步特性允许连接在处理其他事情时保持活动状态。你可能认为javascript的XHR是阻塞的,因为它是单线程的。
javascript中的XHR是无阻塞的,因为事件循环模型——javascript引擎一直处于循环中,检查注册的调用是否已经完成,以及它的回调是否应该被处理。这使得它的操作是非阻塞的,从而允许一个javascript应用程序处理多个XHR长轮询请求。
如果您能够为请求使用jQuery,那么它可以很好地使用以下函数包装XHR: http://api.jquery.com/jQuery.ajax/。这样,您就可以定义一个20秒的超时并立即处理它(重新启动与服务器的连接)。
Aside -您可能希望考虑您的服务器堆栈来优化长轮询。确保你的web服务器不会为每个请求生成一个线程(像Apache 2.2)——否则你会很快耗尽系统资源!如果您可以使用node.js(它非常适合处理许多并发请求),请查看socket。IO库作为服务器端和客户端解决方案(http://socket.io/#home)。
- 如何使用offer/answer交换来自两个对等连接的流
- 在Qualtrics中,介绍如何动态连接两个滑块
- 如何添加两个变量而不使其在javascript中连接
- 如何在Javascript中连接两个结构不同的对象
- 连接流星中的两个收藏(帖子评论)
- Webrtc和socket.io:createanswer()总是有一个错误.为什么?我的代码连接了两个对等体,但其中只
- 使用包含过滤器在环回中连接两个模型
- 如何使用 href 连接两个参数
- 如何完成此循环?连接前面的两个字符
- '对象不是函数'当使用angular连接两个json数组时
- 使用WebRTC对等连接进行两个以上参与者的视频会议是否可行
- 尝试连接Angular.js或JavaScript中的两个函数返回
- Javascript-如何连接单词脚本的两个大写首字母
- 连接两个变量
- 如何在同一个网页上创建两个连接列表
- 制作两个连接的选择字段非常丑陋,我做错了什么
- 给定两个连接的可排序 JQuery 列表,我怎么知道元素被放在哪个容器上
- Javascript:每个客户端有两个连接
- 如何在两个连接之间同步数据
- 同一个应用程序中与mongoose的两个连接.第二个连接是连接第一个依赖项