如何使用netty框架进行长轮询?比如说我拿了http://localhost/waitforx
但是waitforx
是异步的,因为它必须等待一个事件?比如说它从阻塞队列中取出一些东西(只能在队列中的数据时获取).从队列中获取项目时,我想将数据发送回客户端.希望有人可以给我一些如何做到这一点的提示.
非常感谢
我目前正在Django开发一个网站,我想实现某种准实时更新系统.
由于这个站点是用于移动设备,我想知道定期轮询服务器进行更改(比如每5秒)和使用某种Websocket实现之间的性能比较ala http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent /.
关于电池寿命,差异可以忽略不计?代码方面,似乎AJAX实现也会更简单.
我有一个带socket.io的node.js服务器:
var io = require('socket.io').listen(app);
// assuming io is the Socket.IO server object
io.configure(function () {
io.set("transports", ["xhr-polling"]);
io.set("polling duration", 10);
});
io.sockets.on('connection', function(socket){
console.log('connected: %s', socket.id);
...
}
Run Code Online (Sandbox Code Playgroud)
使用xhr-polling和10秒的轮询持续时间,这是否意味着每10秒钟会调用一个新连接?如果是这样,如果用户断开连接,我该如何跟踪用户?我在heroku上运行node.js.
我目前正在探索SignalR,这项技术支持传输(网络套接字,长轮询,服务器发送事件和永久帧).
我已经理解术语网络套接字和长轮询.但什么是Server-Sent Events和Forever Frame?
四者如何相互不同?
我正在尝试实时下载贴有特定标签的照片.我发现实时api很无用,所以我使用长轮询策略.下面是伪代码,其中包含sublte错误的注释
newMediaCount = getMediaCount();
delta = newMediaCount - mediaCount;
if (delta > 0) {
// if mediaCount changed by now, realDelta > delta, so realDelta - delta photos won't be grabbed and on next poll if mediaCount didn't change again realDelta - delta would be duplicated else ...
// if photo posted from private account last photo will be duplicated as counter changes but nothing is added to recent
recentMedia = getRecentMedia(delta);
// persist recentMedia
mediaCount = newMediaCount;
}
Run Code Online (Sandbox Code Playgroud)
第二个问题可以通过Set …
我真的很喜欢RxJava,它是一个很棒的工具,但有些时候很难理解它是如何工作的.我们在Android项目中使用Retrofit和RxJava,并且有以下用例:
我需要轮询服务器,重试之间有一些延迟,而服务器正在做一些工作.服务器完成后,我必须提供结果.所以我用RxJava成功完成了它,这里是代码片段:我用"skipWhile"和"repeatWhen"
Subscription checkJobSubscription = mDataManager.checkJob(prepareTweakJob)
.skipWhile(new Func1<CheckJobResponse, Boolean>() {
@Override
public Boolean call(CheckJobResponse checkJobResponse) {
boolean shouldSkip = false;
if (SHOW_LOGS) Logger.v(TAG, "checkJob, skipWhile, jobStatus " + checkJobResponse.getJobStatus());
switch (checkJobResponse.getJobStatus()){
case CheckJobResponse.PROCESSING:
shouldSkip = true;
break;
case CheckJobResponse.DONE:
case CheckJobResponse.ERROR:
shouldSkip = false;
break;
}
if (SHOW_LOGS) Logger.v(TAG, "checkJob, skipWhile, shouldSkip " + shouldSkip);
return shouldSkip;
}
})
.repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Void> observable) {
if (SHOW_LOGS) Logger.v(TAG, "checkJob, repeatWhen " + …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Tornado和JS Prototype库编写简单的Web应用程序.因此,客户端可以在服务器上执行长时间运行的作业.我希望,这项工作以异步方式运行 - 以便其他客户可以查看页面并在那里做一些事情.
在这里我得到了:
#!/usr/bin/env/ pytthon
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
import os
import string
from time import sleep
from datetime import datetime
define("port", default=8888, help="run on the given port", type=int)
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render("templates/index.html", title="::Log watcher::", c_time=datetime.now())
class LongHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.wait_for_smth(callback=self.async_callback(self.on_finish))
print("Exiting from async.")
return
def wait_for_smth(self, callback):
t=0
while (t < 10):
print "Sleeping 2 second, t={0}".format(t)
sleep(2)
t += 1
callback()
def on_finish(self):
print ("inside …
Run Code Online (Sandbox Code Playgroud) 我试图在Angularjs中执行一个简单的长轮询请求 - 我发出一个GET请求,它会挂起,直到服务器响应.然后我再次提出请求并等待下一个响应 - 依此类推.
但是,由于某种原因,代码非常不可靠,并且错过了从服务器发送的大约80%的响应.
以下是我的代码:
main.messages=[];
...
main.poll=function(){
$http.get('http://localhost:8080/message')
.success(function(data){
console.log(data);
main.messages.push(data);
main.poll();
})
.error(...)
};
Run Code Online (Sandbox Code Playgroud)
我有什么明显的遗失吗?
服务器可以检测到浏览器已连接,服务器确实发送了响应,但上面的代码没有得到响应(没有控制台输出也没有错误).我尝试用postman(chrome扩展)发出这个请求,并且长轮询在那里工作得很好所以我认为这个问题就在这里.
更新:问题仅发生在Google Chrome上,并且仅当有多个标签同时执行长轮询时才会出现问题.使用长轮询创建和关闭新选项卡时会出现一些看似随机的行为.
我正在尝试使用Flask Framework在JQuery和Python上进行长时间的轮询.
在PHP之前完成了长时间的轮询,我试图以同样的方式进行:
具有while(true)循环的脚本/函数,定期检查更改,例如数据库中每0.5秒,并在发生更改时返回一些数据.
所以在我的ini .py中我创建了一个app.route to/poll for JQuery to call.JQuery为它提供了有关客户端当前状态的一些信息,并且poll()函数将其与数据库中当前的状态进行了比较.循环结束并在观察到变化时返回信息.
这是python代码:
@app.route('/poll')
def poll():
client_state = request.args.get("state")
#remove html encoding + whitesapce from client state
html_parser = HTMLParser.HTMLParser()
client_state = html_parser.unescape(client_state)
client_state = "".join(client_state.split())
#poll the database
while True:
time.sleep(0.5)
data = get_data()
json_state = to_json(data)
json_state = "".join(data) #remove whitespace
if json_state != client_state:
return "CHANGE"
Run Code Online (Sandbox Code Playgroud)
问题是,当上面的代码开始轮询时,服务器似乎被重载和其他Ajax调用,而其他请求,如使用JQuery将"加载"图像加载到html是无响应和超时.
为了完成起见,我在这里包含了JQuery:
function poll() {
queryString = "state="+JSON.stringify(currentState);
$.ajax({
url:"/poll",
data: queryString,
timeout: 60000,
success: function(data) {
console.log(data);
if(currentState == null) …
Run Code Online (Sandbox Code Playgroud) 我坚持为什么移动到IIS7服务器的node.js应用程序现在失败了.我知道IIS7不支持Web套接字,但我的理解是,如果Web套接字不可用,socket.io将回退到长轮询.所以现在当用户试图按下通常需要套接字或长轮询的特定按钮时,我会得到这样的结果:
XHR finished loading: POST "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777964357-6&sid=QWsESi0c9ih7WMWKAAAC".
GET https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC 400 (Bad Request)
XHR finished loading: GET "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC".
OPTIONS https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC
XMLHttpRequest cannot load https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC. Invalid HTTP status code 400
Run Code Online (Sandbox Code Playgroud)
当我点击GET或XMLHttpRequest时,我可以看到响应是"code":1,"message":"Session ID unknown"
,我不明白,因为我可以看到SID.当我单击列出的选项失败代码时,我发现问题来自Request.prototype.create,即xhr发送:
xhr.send(this.data);
Run Code Online (Sandbox Code Playgroud)
有谁知道可能导致这些事情的原因是什么?
任何澄清将不胜感激!
非常感谢!