我正在尝试使用 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 请求。有没有办法知道客户端是否关闭了他的连接?
我正在尝试实现生命周期感知的长轮询(在活动/片段中)。轮询将限定在每隔固定时间间隔向服务器发送 API 请求的片段。但是,我无法实施它。
- 在客户端有一个硬超时,而不考虑在接收响应时产生的任何额外延迟。
- 在发送下一个请求之前等待上一个 API 调用的响应。即,由于轮询间隔,轮询队列中的请求应等待响应,而不管其优先级如何
考虑:
HARD_TIMEOUT = 10 秒
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)
对于这个用例,我想使用轮询而不是套接字。任何想法/解决方案将不胜感激。谢谢你。
我正在创建一个与长轮询一起工作的聊天应用程序,以模拟从服务器到客户端的"推送".
基本上,浏览器要求更新,我回复是否有新的东西.否则,我保持连接打开而不响应,直到有东西要发回.
现在,如果30秒过去了,我还没有发送任何内容,那么我发送回复,基本上说"NoNews",客户端将再次进行轮询.
我想要做的是显然保持这种连接,而不是尽可能长时间地回复,在浏览器只是超时并放弃我...我没有找到关于每个浏览器的客户端超时的良好文档,它似乎对所有人来说都是一样的......
你们有没有做过长期投票申请?
任何想法最长的安全超时可能是什么?
谢谢!
我在我的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但它似乎还没有完全出炉(特别是在浏览器支持方面).我还考虑了对服务器进行真正的轮询,但这会更加复杂,所以我希望继续保持开放连接并尽可能地传输消息.
我正在Rails 3.1中编写一个简单的聊天室应用程序 - 用于学习目的.对于初学者我有所有需要的模型(消息,用户,房间等),事情很好.客户端每分钟轮询服务器(例如)并获得新消息(如果有).
我想将简单轮询更改为长轮询,并且无法确定是否可以在同一个应用程序中完成此操作,或者我是否必须为长轮询创建其他推送服务器.
我阅读了很多关于EventMachine的内容,并将我的rails应用程序更改为用户,因为我想将EventMachine用于事件驱动的机制.我认为EventMachine频道会派上用场.客户端将连接并等待聊天室中的消息,并且仅当一个人被发送到房间时它才会收到消息.
我无法弄清楚的是如何在所有客户端连接之间共享EventMachine :: Channel实例.这种方法是否可行,或者我是否采取了错误的方式?
如果可能的话,我想要一个可以作为Heroku上托管的单个rails应用程序运行的解决方案.
我正在尝试在Node.js中实现一个http长轮询服务器,并且如果达到超时,则不知道如何关闭/关闭挂起的请求.
我想到了3种可能的解决方案:
这两种解决方案似乎都不合理,那么Node.js实现这样的方法会是什么?
我正在阅读这个关于长轮询的问题,除了提供解决方案之外,还有一个关于Apache处理大量请求的低效率的有趣观点.我对Apache Tomcat有同样的担忧吗?
Apache Tomcat是否足以处理长轮询.我知道Apache Tomcat支持相当大量的并发线程,但它是否已经缩放到这样一个限制,我们可以像上面提到的线程所解释的那样将它用于Long Polling?
我一直在研究长轮询系统.我用烧瓶+ 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) 客户端启动长轮询,在服务器上调用一个方法,并传入一个AsyncCallback包含回调委托的实例,当服务器异步返回客户端时将调用该委托.
现在我对此的理解是有限的,但似乎在BasicHttpWCF中AsyncCallback参数被序列化并发送到服务器,然后服务器对其进行反序列化,缓存它并最终调用它以"返回"到客户端.
首先,上述解释是否正确?其次,如何AsyncCallback通过网络在客户端上调用?
只有一个问题,我只是在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调用,如下所示.
