我需要一些linux大师的帮助.我正在开发一个包含彗星服务器的webapp.彗星服务器在localhost:8080上运行并公开url localhost:8080/long_polling以供客户端连接.我的webapp在localhost:80上运行.
我已经使用nginx代理从nginx到彗星服务器的请求(localhost:80/long_polling代理到localhost:8080/long_polling),但是,我有两个抱怨这个解决方案:
所以我的问题是:是否有任何linux技巧允许我在不使用nginx代理的情况下将localhost:8080/long_polling暴露给localhost:80/long_polling?一定有东西.这就是为什么我认为这个问题可能是linux大师最好的答案.
我需要/ long_polling在端口80上公开的原因是我可以使用AJAX连接到它(ajax same-origin-policy).
这是我的nginx proxy.conf供参考:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
send_timeout 600;
proxy_buffering off;
Run Code Online (Sandbox Code Playgroud) 客户端请求来自服务器的网页.然后Clent要求进行额外的计算; 服务器执行一系列计算并在可用时立即发送部分结果(文本格式,每行包含单独的完整项目).客户端使用服务器提供的信息更新网页(使用JavaScript和DOM).
这似乎适合Ajaxpatterns站点的HTTP Streaming(当前版本)模式.
问题是如何以跨浏览器(浏览器不可知)的方式进行,最好不使用JavaScript框架,或使用像jQuery这样的轻量级框架.
问题始于以跨浏览器方式生成XMLHttpRequest,但我认为主要项目是并非所有浏览器都能onreadystatechange
从XMLHttpRequest正确实现; 并非所有浏览器都onreadystatechange
在每个服务器刷新上调用事件(顺便说一下.如何在CGI脚本中强制刷新服务器(在Perl中)?).Ajaxpatterns上的示例代码通过使用计时器处理此问题; 如果我发现部分响应,我应该丢弃定时器解决方案onreadystatechange
吗?
添加11-08-2009
当前解决方案:
我使用以下函数创建XMLHttpRequest对象:
function createRequestObject() {
var ro;
if (window.XMLHttpRequest) {
ro = new XMLHttpRequest();
} else {
ro = new ActiveXObject("Microsoft.XMLHTTP");
}
if (!ro)
debug("Couldn't start XMLHttpRequest object");
return ro;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用一些(最好是轻量级)JavaScript框架,比如jQuery,如果用户选择不安装jQuery,我希望有后备.
我使用以下代码启动AJAX; setInterval
因为某些浏览器onreadystatechange
仅在服务器关闭连接后调用(可能需要长达数十秒),而不是在服务器刷新数据(大约每秒或更多次)之后调用.
function startProcess(dataUrl) {
http = createRequestObject();
http.open('get', dataUrl);
http.onreadystatechange = handleResponse;
http.send(null);
pollTimer = setInterval(handleResponse, 1000);
}
Run Code Online (Sandbox Code Playgroud)
该handleResponse
功能是最复杂的一个,但它的草图如下所示.可以做得更好吗?如何使用一些轻量级JavaScript框架(如jQuery)?
function handleResponse() …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个iPhone应用程序,它将使用长轮询通过HTTP将服务器的事件通知发送到客户端.在服务器上打开连接后,我发送了一小部分代表事件的JSON.我发现-[NSURLConnectionDelegate connection:didReceiveData]
直到我关闭连接后才会调用,无论我在创建时使用的缓存设置如何NSURLRequest
.我已经验证了服务器端正在按预期工作 - 第一个JSON事件将立即发送,后续事件将在发生时通过线路发送.有没有办法在NSURLConnection
发生这些事件时使用它们,或者我需要转而使用CFSocket API?
我正在开始集成CocoaAsyncSocket,但是NSURLConnection
如果可能的话,我更愿意继续使用它,因为它更适合我基于REST/JSON的其余Web服务结构.
在HttpWatch的帮助下,我试图找出GMail如何实现Comet.
我使用两个帐户登录GMail,一个在IE中,另一个在Firefox中.在GMail中使用"WASSUP"等一些神奇的词语在GMail中聊天.然后,我注销两个GMail帐户,过滤任何http内容而不使用"WASSUP"字符串.结果显示哪个HTTP请求是流式传输通道.(注意:我必须注销.否则,永无止境的HTTP不会在HttpWatch中显示内容.)
结果很有趣.流通道的URL如下:
https:// mail/channel/bind?VER = 8&at = xn3j33vcvk39lkfq .....
毫无疑问,GMail使用IFRAME进行IE浏览.Http内容以" <html><body>
" 开头.
最初,我猜测GMail在Firefox中使用多部分XmlHttpRequest进行Comet.令我惊讶的是,响应标头没有"multipart/x-mixed-replace"标头.响应标头如下:
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Date: Sat, 20 Mar 2010 01:52:39 GMT
X-Frame-Options: ALLOWALL
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
Server: GSE
X-XSS-Protection: 0
Run Code Online (Sandbox Code Playgroud)
不幸的是,HttpWatch不会告诉HTTP请求是否来自XmlHttpRequest.内容不是HTML而是JSON.它看起来像是对XHR的响应,但是如果没有multipart/x-mixed-replace,这对Comet不起作用,对吗?
还有什么办法可以弄清楚GMail如何实现Comet?
更新: 经过进一步调查,我相信GMail以这种方式实现了Comet:1)在IE中,它使用了forever-hidden-iframe; 2)在Firefox中,它使用forever-XHR而不使用multipart/x-mixed-replace标头.客户端将在条件(readyState == 3)OR(readyState == 4)中响应.也就是说,处于交互状态和完整状态.
我想知道为数千名用户编写聊天应用程序代码的正确方法是什么.
我只是困惑如何能够每秒使用AJAX ping服务器或者更少,并检查MySQL中是否有新记录,服务器负载量是否可接受.
我目前正在考虑使用jQuery,PHP和MySQL进行编码.
请指教.非常感谢您的帮助.
我正在构建一个需要相对不变的数据库轮询的网页组件.我可以看到两种不同的方法,我想知道其中一种是否比其他方法更好,或者我是否缺少第三种选择.
1)每隔1或2秒发送一次AJAX请求以检查更新.无论是否有新数据,每个请求都会立即返回.
2)触发单个AJAX请求,该请求在收到数据或发生超时之前不会返回.在其中任何一个发生时,它会触发下一个请求.(我认为这叫做长轮询?)
数据库查询的数量与之相同,但使用#2,从浏览器发出的请求将减少,这可以节省带宽和客户端资源.对于服务器,最好让一个PHP请求保持活动状态并在查询之间休眠,或者每隔几秒触发一次,轮询数据库,然后关闭?或者没有区别,我对此太过强调了?
编辑:我想我还应该声明这是一个更大的网络应用程序的聊天小部件.通信的轻微延迟不会杀死用户,因为聊天是次要功能.
我想知道如何(如果有的话)烧瓶执行长轮询,因此服务器可以通过连接发送数据到客户端.例如,如果服务器通过流式api接收到Twitter提要,那么它将如何传递给客户端浏览器?
我知道你不能在这种情况下使用flask.flash.
谢谢
谢谢你的例子.我查看了这些示例,当我尝试为我的代码实现它时,它仍然没有在客户端浏览器中提供实时输出.
我使用juggernaut和redis将它基于烧瓶片段().这是我的python代码:
import flask
from flask.views import MethodView
from tweetStreamsRT import StreamerRt
from juggernaut import Juggernaut
app = flask.Flask(__name__)
app.secret_key = "xxxxx"
PORT = 8080
class View(MethodView):
def get(self):
return flask.render_template('index.html')
def post(self):
results = StreamerRt().filter(track=[flask.request.form['event']])
jug = Juggernaut()
jug.publish('channel', results)
return self.get()
app.add_url_rule('/', view_func = View.as_view('index'), methods=['GET', 'POST'])
app.debug = True
if __name__ == "__main__":
print 'Listening on http://localhost:%s' % PORT
app.run()
Run Code Online (Sandbox Code Playgroud)
我的html页面是继承自基本html页面的:
{% extends "base.html" %}
{% import "forms.html" as forms %}
{% block page_header …
Run Code Online (Sandbox Code Playgroud) 我怎样才能在ASP.Net MVC中实现Comet架构?
我正在寻找一个基于谷歌地图的网络应用程序.我最初的想法是,在第一阶段,重点应放在前端,后端应该易于编写和原型,并应尽可能地帮助前端的发展.
没有"经典"页面,只有meebo.com风格的界面.javascript + jquery.(意思是,如果没有静态页面,则很少).
我的眼睛已经抓住了彗星风格的服务器推送范例,我真的很有兴趣用这个做一些概念证明.
您是否有任何建议或优缺点或使用经验:
Python + Tornado vs Scala + Lift?
Web应用程序的其他方面还有哪些优点或缺点可供选择?
注意:这适用于最多2位开发人员,而不是大型分布式和变更团队.
谢谢
comet ×10
ajax ×3
javascript ×2
php ×2
python ×2
asp.net ×1
asp.net-mvc ×1
flask ×1
gmail ×1
httpwatch ×1
iphone ×1
jquery ×1
juggernaut ×1
lift ×1
long-polling ×1
nginx ×1
node.js ×1
objective-c ×1
performance ×1
reverse-ajax ×1
scala ×1
streaming ×1
tornado ×1