标签: long-polling

如何知道客户端何时在 Flask 应用程序中断开连接

我正在尝试使用 HTTP 长轮询,大致是这样的:

@app.route('/get_stuff', methods=["GET"])
def get_stuff():
    while True:
        stuff = database.lookupSomething()
        if stuff:
            return json.dumps(stuff)
        else:
            time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

这非常有效,但是如果客户端切断连接,服务器仍将运行循环。我想用这样的东西替换循环:

while client.is_connected():
    ....
Run Code Online (Sandbox Code Playgroud)

但是,我找不到任何方法来知道连接是否仍然有效。其他人也问过同样的问题,答案一直是使用SocketIO。但是,我不能这样做,而宁愿使用像上面这样的简单 GET 请求。有没有办法知道客户端是否关闭了他的连接?

python connection long-polling flask

6
推荐指数
0
解决办法
1001
查看次数

使用改造和 kotlin 通道实现长轮询

我正在尝试实现生命周期感知的长轮询(在活动/片段中)。轮询将限定在每隔固定时间间隔向服务器发送 API 请求的片段。但是,我无法实施它。

这就是我希望实现的样子

  • 在客户端有一个硬超时,而不考虑在接收响应时产生的任何额外延迟。
  • 在发送下一个请求之前等待上一个 API 调用的响应。即,由于轮询间隔,轮询队列中的请求应等待响应,而不管其优先级如何

考虑:

HARD_TIMEOUT = 10 秒

POLLING_INTERVAL = 2 秒 在此处输入图片说明

 Request 1: Started at: 0sec      Response delay:1.2sec   Duration left: 0.8sec
 Request 2: Started at: 2sec      Response delay:0.4sec   Duration left: 1.6sec
 Request 3: Started at: 4sec      Response delay:2.5sec   Duration left: 0sec
 Request 4: Started at: 6.5sec    Response delay:0.5sec   Duration left: 1.0sec
 Request 5: Started at: 8sec      Response delay:0.8sec   Duration left: 1.2sec
Run Code Online (Sandbox Code Playgroud)

对于这个用例,我想使用轮询而不是套接字。任何想法/解决方案将不胜感激。谢谢你。

android polling long-polling android-lifecycle kotlin

6
推荐指数
1
解决办法
1460
查看次数

在没有获得超时的情况下,在响应浏览器之前我可以等待多长时间?

我正在创建一个与长轮询一起工作的聊天应用程序,以模拟从服务器到客户端的"推送".

基本上,浏览器要求更新,我回复是否有新的东西.否则,我保持连接打开而不响应,直到有东西要发回.

现在,如果30秒过去了,我还没有发送任何内容,那么我发送回复,基本上说"NoNews",客户端将再次进行轮询.

我想要做的是显然保持这种连接,而不是尽可能长时间地回复,在浏览器只是超时并放弃我...我没有找到关于每个浏览器的客户端超时的良好文档,它似乎对所有人来说都是一样的......

你们有没有做过长期投票申请?
任何想法最长的安全超时可能是什么?

谢谢!

comet http long-polling

5
推荐指数
1
解决办法
2455
查看次数

在Django长期投票

我在我的Django应用程序中使用了一种长轮询,以便在客户端进行过程中向客户端返回有关长操作的状态消息.我通过在我的视图函数中返回一个HttpResponse对象来实现这一点,该函数使用返回字符串的迭代器进行初始化.这一切都很好,但是迭代器函数变得非常长,有大量的收益来返回状态消息.

我想通过将长操作分成多个函数来更好地构建这个函数,每个函数都返回自己的状态消息.但我看不到这样做的方法.换句话说,我有这个:

def my_long_operation():
  do_something()
  yield "Did something"
  do_something_else()
  yield "Did something else"
Run Code Online (Sandbox Code Playgroud)

......我希望:

def do_something():
  do_first_part_of_something()
  yield "Did first part of something"
  do_second_part_of_something()
  yield "Did second party of something"

def do_something_else():
  do_first_part_of_something_else()
  yield "Did first part of something else"
  do_second_part_of_something_else ()
  yield "Did second party of something else"

def my_long_operation():
  do_something()
  do_something_else()
Run Code Online (Sandbox Code Playgroud)

有没有办法让第二个例子中的yield得到迭代器调用者的值?如果没有,是否有更好的方法?我查看了WebSockets但它似乎还没有完全出炉(特别是在浏览器支持方面).我还考虑了对服务器进行真正的轮询,但这会更加复杂,所以我希望继续保持开放连接并尽可能地传输消息.

python django long-polling

5
推荐指数
1
解决办法
2900
查看次数

使用EventMachine的Rails应用程序可以进行长轮询吗?

我正在Rails 3.1中编写一个简单的聊天室应用程序 - 用于学习目的.对于初学者我有所有需要的模型(消息,用户,房间等),事情很好.客户端每分钟轮询服务器(例如)并获得新消息(如果有).

我想将简单轮询更改为长轮询,并且无法确定是否可以在同一个应用程序中完成此操作,或者我是否必须为长轮询创建其他推送服务器.

我阅读了很多关于EventMachine的内容,并将我的rails应用程序更改为用户,因为我想将EventMachine用于事件驱动的机制.我认为EventMachine频道会派上用场.客户端将连接并等待聊天室中的消息,并且仅当一个人被发送到房间时它才会收到消息.

我无法弄清楚的是如何在所有客户端连接之间共享EventMachine :: Channel实例.这种方法是否可行,或者我是否采取了错误的方式?

如果可能的话,我想要一个可以作为Heroku上托管的单个rails应用程序运行的解决方案.

ruby ruby-on-rails long-polling eventmachine

5
推荐指数
1
解决办法
2572
查看次数

node.js中的长轮询 - 如果没有可用数据,如何"暂停"挂起的请求?

我正在尝试在Node.js中实现一个http长轮询服务器,并且如果达到超时,则不知道如何关闭/关闭挂起的请求.

我想到了3种可能的解决方案:

  1. 将pendingRequest与时间戳存储在散列/对象中,然后调用setIntervall,以便在时间戳太旧时,每隔1/2/x秒删除pendingRequests.
  2. 在套接字连接上设置超时

这两种解决方案似乎都不合理,那么Node.js实现这样的方法会是什么?

long-polling node.js

5
推荐指数
1
解决办法
2139
查看次数

Apache Tomcat对长轮询的效率如何?

我正在阅读这个关于长轮询的问题,除了提供解决方案之外,还有一个关于Apache处理大量请求的低效率的有趣观点.我对Apache Tomcat有同样的担忧吗?

Apache Tomcat是否足以处理长轮询.我知道Apache Tomcat支持相当大量的并发线程,但它是否已经缩放到这样一个限制,我们可以像上面提到的线程所解释的那样将它用于Long Polling?

tomcat long-polling

5
推荐指数
1
解决办法
6735
查看次数

我想将gevent.evnet用于celery.task

我一直在研究长轮询系统.我用烧瓶+ mongokit + celery + gevent.

当进入芹菜任务时,完成gevent.event.set()不能正常工作.所以我想帮助解决这个问题.(我之所以与celery同时使用gevent,在Notification系统中有很大的处理过程)

这是我的示例代码.

 #server.py
 @celery.task()
 def doing_task(uid, message):
     notification = Notification() # this is a notification Model
     notification.add(request.args.get('to'), some_notification)
     app.event.set()
     app.event.clear()

 @app.route('/main')
 def main():
     return render_template('main.html')

 @app.route('/set')
 def set():
     doing_task.delay(request.args.get('uid'), 'Notify')
     return 'OK'

 @app.route('/poll')
 def poll():
     uid = request.args.get('uid')
     app.event.wait()
     if is_authorized(uid): #uid 1 is a authorized account
         return Notification().get(uid)

 #main.html
 <body>
   <button>Click me</button>
 </body>
 <script>
   $('button').click(function(e) {
    $.ajax({
     'url': '/set',
     'data': 'uid=1',
     'success': function(data) {
       console.log(data);
     }
    });
    e.preventDefault();
  });

      var poll = function() …
Run Code Online (Sandbox Code Playgroud)

python long-polling celery gevent flask

5
推荐指数
1
解决办法
848
查看次数

长轮询ACTUALLY如何在客户端上调用回调?

客户端启动长轮询,在服务器上调用一个方法,并传入一个AsyncCallback包含回调委托的实例,当服务器异步返回客户端时将调用该委托.

现在我对此的理解是有限的,但似乎在BasicHttpWCF中AsyncCallback参数被序列化并发送到服务器,然后服务器对其进行反序列化,缓存它并最终调用它以"返回"到客户端.

首先,上述解释是否正确?其次,如何AsyncCallback通过网络在客户端上调用?

c# wcf basichttpbinding long-polling

5
推荐指数
1
解决办法
1810
查看次数

在安全连接(HTTPS)中使用与SignalR的"longpoling"连接时的安全警报 IE8

只有一个问题,我只是在HTTPS中的SignalR聊天应用程序中收到"Securty Waring"警报IE 8

在此输入图像描述

我在使用时longpolling作为传输类型使用IE8.它在所有其他IE浏览器中工作正常.

self.Connect = function () {
     hubConn.start({ transport: 'longPolling' }).done(function (result) {
                ///--
     }).fail(function (error) {
                ///--
         alert("error" + error);
     });
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用fiddler时,安全警告出现了信号器ajax调用,如下所示.

在此输入图像描述

asp.net https long-polling internet-explorer-8 signalr

5
推荐指数
1
解决办法
249
查看次数