问题标签 [long-polling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
382 浏览

http - 高流量网站的长轮询问题

假设我有脚本,它会在服务器上进行长时间轮询以检查用户是否有任何新消息。服务器端将是这样的

它检查数据库5次,每次如果没有变化,它会等待5s直到下一次检查,这导致最大执行时间约为25s。

当客户从一个页面快速移动到另一个页面时会发生什么?我想即使客户端移动到不同的页面,服务器脚本也会继续运行,在那里它会发送另一个更改请求。

这是否意味着,当很多人在网站上快速移动时(每个页面上的最长执行时间少于 25 秒),那么服务器必须继续运行所有脚本,这些脚本试图响应不存在的页面还有吗?这不会导致服务器非常快地使用它的所有线程池吗?

0 投票
1 回答
3054 浏览

ajax - 关闭长轮询连接,jQuery-ajax

背景
我使用支持长轮询的类似 Tornado 的服务器。用户访问的每个新网页都会对服务器设置一个长轮询,如下所示:

问题
我现在将依赖从 Fiddler 获得的数据来监控从我的浏览器发出的所有请求(目前为 FF)。

  1. 第 1 页已加载并发出长轮询请求,现在在服务器端空闲。
  2. 我单击第 2 页的链接,该页面已加载并设置了一个长轮询请求,但来自第 1 页的长轮询请求仍在服务器端空闲(根据 Fiddler)。

这意味着当点击页面时我将堆叠所有长轮询调用,因此最终在服务器上有大量活动连接(或者它们可能共享连接?)

我的想法
- 因为它是一个类似 Tornado 的服务器(使用 epoll),它可以处理相当多的连接。但在我看来,这一事实不可利用。我的意思是,对于这种情况,我不希望服务器超时(如果客户端消失了)。
- 我知道那些独立页面更好地使用一个共同的头部,并且只通过 ajax 调用交换内容,但我们今天使用的这种设计不是我的调用......
- 解决这个问题的最佳方法可能是重用连接(很难我认为关闭)或在浏览器离开页面后立即关闭(您单击另一个页面)。

谢谢
——MyGGaN

0 投票
2 回答
7238 浏览

c# - 如何在 C# 中进行长轮询客户端?

我有一个 C# 桌面应用程序,我毫无问题地使用了一个 Web 服务(由“添加服务引用”添加的 wsdl,所以我创建了一个对象并调用它的函数)。

现在,我想使用长轮询技术,但从客户的角度来看,我不知道如何做到这一点。

如何配置超时?我应该使用专门用于此的线程吗?有 C# 桌面应用程序的示例吗?(还没有找到)

谢谢,大坝的

0 投票
2 回答
2112 浏览

apache-flex - Flex:没有 BlazeDS 的长轮询(即服务器推送)?

除了使用 BlazeDS,是否有任何预先存在的库在 Flex 中实现长轮询(或服务器推送)?

注意:我读过我喜欢实现 Flex 到服务器彗星/长轮询游戏,但他只是问是否有可能实现......不是如果实现存在。

0 投票
2 回答
765 浏览

silverlight - 轮询双工不能扩展......有什么替代方案?

我们的测试表明,轮询双工绑定根本无法扩展,并且不能用于网络农场甚至网络花园内的服务。我们已经查看了客户端推送方法的 TCP/IP 套接字,但防火墙问题确实允许我们使用套接字。

我想知道这个问题的替代“免费”解决方案是什么?允许我们扩展并允许我们将数据推送到客户端......

我也尝试过这篇文章http://tomasz.janczuk.org/2009/09/scale-out-of-silverlight-http-polling.html中的解决方案,但最后,数据库轮询太多,并且性能受到影响。

我们的 Silverlight 应用程序需要发布/订阅设计,但它需要可靠且可扩展……有什么想法吗?

0 投票
5 回答
14284 浏览

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

另请参阅“ WCF 通过防火墙推送到客户端

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

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

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

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


我正在寻找“长轮询”/“彗星”等的内置支持


感谢 Drew Marsh 就如何在 WCF 中实现长轮询提供了最丰富的答案。但是我认为 WCF 的主要“卖点”是您可以通过在配置文件中配置要使用的通道来完成此类事情。 例如,我想要一个逻辑上双向但仅物理传入的通道。

0 投票
1 回答
1097 浏览

c# - 跨自定义 TCP 长轮询服务器驱动事件

我正在尝试编写一个自定义的基于 TCP 的长轮询服务器,它将作为其他 TCP 连接的中间人,这些连接需要比手机提供更多的持久性。

我尝试这样做的方法是用 C# 编写一个异步 TCP 服务器和一个同样用 C# 编写的匹配 TCP 客户端。

长轮询的工作方式(据我所知)是您打开到服务器的 TCP 连接,并且服务器在通过套接字发送回数据之前停止。您发现在移动电话网络上有效的心跳间隔(我听说大约 8 分钟有效?)如果没有更新数据,您将发送一个空数据包。

这就是我的麻烦所在。我不知道如何将客户端的数据请求与服务器上运行的事件处理程序“链接”起来……

流程应该是这样的(“客户端”在电话上):

  1. 用户启动我的应用程序

  2. 客户端发送请求以在数据发生更改时得到通知

  3. 服务器“链接”(注册)客户端的套接字对象到一个“事件处理程序”中,由服务器的其他 TCP 连接调用,我谈到了!

  4. 事件

    o 如果被触发(新数据到了),将数据发送给客户端

    o 如果没有触发(没有新数据),向客户端发送一个“EmptyChanges”数据包

  5. 客户端在手机上接收数据并对其进行处理(根据接收到的数据包类型调用事件处理程序,并将从服务器获得的“数据”传递给它)

  6. 客户端发送请求以在数据发生更改时得到通知

所以,我的问题是我想不出一个能完成我想要它做的设计。问题是我不知道如何做#3。如何“链接”一个事件处理程序与另一个事件处理程序?这些几乎可以保证在不同的线程上运行!

所以,我的应用程序看起来像这样(所有伪代码):

有点儿?我希望它是事件驱动的,但我正忙着弄清楚如何以 PUSH 驱动风格驱动应用程序与我“习惯”的轮询方式。

请善待,因为我可能会做一些过于复杂和愚蠢的事情,因为这是我第一次真正尝试使用 Socket 编程(从不需要它),而且由于手机在瞬态网络上的性质以及我的服务器需要使用 OPEN TCP 连接维护这些电话的位置。

服务器平台:Windows

服务器语言:C#

测试客户端平台:Windows

测试客户端语言:C#

目标客户端平台:Windows Mobile 6.5、iPhone、Android(客户端另写)

目标客户端语言:C#、Obj-C 或 MonoTouch、Java

0 投票
2 回答
348 浏览

javascript - 服务器发生变化时如何更新网页?

有没有办法推送页面进行更改,而不是在网页上放置一个计时器以每 x 分钟刷新一次?我想我想要做的不是刷新整个页面,因为它可能只有一部分发生了变化。我在 FB 上看到更新发生时,它有消息说有新内容可用。

也许您可以对页面进行 MD5 处理,然后当更新发生时,MD5 更改并且页面可能正在检查这一点。不完全是推送,但它会减少整个页面的流量。

服务器发生变化时如何更新网页?

0 投票
3 回答
2909 浏览

php - Ajax long polling (comet) + php on lighttpd v1.4.22 多实例问题

我是这个网站的新手,所以我真的希望我能提供有关我的问题的所有必要信息。

我一直在尝试使用长轮询创建“新消息到达通知”。目前我正在通过window.onLoad我网站中每个页面的事件发起轮询请求。

在服务器端,我有一个无限循环:

在客户端,我有以下(简化的)ajax 函数:

问题是每次页面加载时,上述循环都会重新开始。结果是每个用户都有多个无限循环,最终使我的服务器挂起。

*该NewMessageArived()函数查询 MySQL DB 以获取新的未读消息。

*在我运行的 php 脚本的开头start_session()以获取$current_user值。

我目前是该站点的唯一用户,因此我很容易通过写入time()此循环内的文件来调试此行为。我看到的是该文件在 10 秒内被写入的频率超过一次,但它仅在我从一页到另一页时才开始。

请让我知道是否有任何其他信息可能会有所帮助。

谢谢你。

0 投票
4 回答
2560 浏览

c# - ASP.NET C# 在处理网页时将信息发送回客户端

不确定我是否会正确解释这一点,但这里有。我已经为后面的代码编写了一个使用 C# 的 asp.net 应用程序。在用户做出一些选择并点击“运行”按钮后,我将处理传递给用 C# 编写的 dll,但我想要的是一种定期将信息发送回客户端的方法,这样他们就可以看到发生了什么,比如有多少条记录已经被处理和类似的事情。我怎样才能做到这一点?

谢谢