所有HTTP响应都要求客户端启动它们,甚至是使用AJAX创建的响应.但是,GMail的聊天功能可以接收来自其他用户的消息,即使我只是坐在舒适的电脑椅上观看但没有与浏览器交互.他们是如何做到的呢?
我已经阅读了关于Django和HTTP Push的所有问题和答案.然而,没有一个提供关于如何实现所谓"彗星"功能的基本"hello world"的清晰,简洁,开端到终端的解决方案.
第一个问题(1):HTTP在多大程度上没有(至少到目前为止)为此做出的问题?所有潜在的解决方案基本上都是黑客吗?
2)目前最好的解决方案是什么?
其他解决方案?
3)nginx推送模块如何参与此讨论?
4)这些解决方案中哪一个需要替换典型的mod_wsgi/nginx(或apache)部署模型?他们为什么要这个?在任何情况下这都是有利的转变吗?
5)使用已经在Python中的解决方案的优势有多重要?
来自PyCon 2010的Alex Gaynor的演讲,我刚刚在blip.tv上观看过,它非常精彩且内容丰富,但对Django中HTTP Push的当前状态并不十分具体.他说的一件事给了我一些信心:Orbited在抽象和模拟网络套接字的概念方面做得很好.因此,当WebSockets实际着陆时,我们将处于转型的好地方.
6)HTML5 Websockets与当前解决方案有何不同?Gaynor对从Orbited过渡的难易程度的评估是否准确?
我的问题可能听起来很愚蠢,但我只是想确定一下:
比如说你有一个HTML页面index.html,只显示一个名为的图片img.jpg.现在,如果您的服务器知道访问者每次都会请求HTML文件然后请求jpg图像:
服务器是否可以在HTML文件之后发送图像以节省时间?
我知道HTTP是一种同步协议,所以理论上它不应该工作,但我只是想让某人确认(或不是).
Servlet-3.0 API允许分离请求/响应上下文并在以后回复它.
但是,如果我尝试编写大量数据,例如:
AsyncContext ac = getWaitingContext() ;
ServletOutputStream out = ac.getResponse().getOutputStream();
out.print(some_big_data);
out.flush()
Run Code Online (Sandbox Code Playgroud)
对于Tomcat 7和Jetty 8,它实际上可能会阻塞 - 并且它确实阻塞了琐碎的测试用例.教程建议创建一个可以处理这种设置的线程池 - 这通常是对传统10K架构的反作用.
但是,如果我有10,000个打开的连接和一个让我们说10个线程的线程池,那么即使1%的具有低速连接或仅阻塞连接的客户端阻塞线程池并完全阻止彗星响应或减慢其速度也足够了显著.
预期的做法是获得"写就绪"通知或I/O完成通知,而不是继续推送数据.
如何使用Servlet-3.0 API完成,即如何获得:
如果Servlet-3.0 API不支持,那么是否有任何特定于Web Server的API(如Jetty Continuation或Tomcat CometEvent)允许真正异步处理此类事件而无需使用线程池伪造异步I/O.
有人知道吗?
如果这不可能,您可以参考文档确认吗?
我附上了模拟事件流的代码.
笔记:
ServletOutputStream该抛出IOException来检测断开连接的客户端keep-alive消息以确保客户端仍在那里在这样的例子中,我明确定义了大小为1的线程池来显示问题:
curl http://localhost:8080/path/to/app(两次)curd -d m=message http://localhost:8080/path/to/appcurd -d m=message http://localhost:8080/path/to/app我想在不使用线程池的情况下解决这样的问题,因为使用1000-5000个开放连接,我可以非常快地耗尽线程池.
下面的示例代码.
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import …Run Code Online (Sandbox Code Playgroud) 我想在一个简单的Web应用程序中添加一些Comet /服务器推送功能.我无法找到有关如何执行此操作的最新信息.
有人能指出我使用Comet with Spring MVC的一些示例,教程,博客或最近的任何内容吗?
如果它很重要,我使用Freemarker来渲染视图,使用JQuery来构建JavaScript框架.
旁白:我已经了解了Lift及其内置的强大Comet支持.这个应用程序是我已经使用Lift实现的概念证明.现在我用Spring MVC构建它来进行比较和对比.
编辑:我已经开始尝试DWR了.这不是太棒了,但我能做出有用的东西.我也检查了Atmosphere,但我根本无法获得任何牵引力.
我要打开这个问题了.希望会有更好的建议.
BOSH是......
一种传输协议,通过有效地使用多个同步HTTP请求/响应对来模拟两个实体(例如客户端和服务器)之间的长期双向TCP连接的语义,而无需使用频繁的轮询或分块响应.
这听起来像WebSockets和HTTP长轮询,除了它使用两个开放的HTTP连接而不是一个,并且不扩展HTTP协议.
两个协议之间有什么区别,哪个用例更喜欢WebSockets而不是BOSH?
任何人都可以给我一个使用PHP的彗星技术的简单例子吗?
我只需要一个使用持久HTTP连接或类似的示例.我不想使用轮询技术,因为我有这样的设置,不仅难以使用和管理它的大量资源.我也使用IIS7而不是Apache.
一个很好的例子真的很有用,所以我可以从这种丑陋的轮询技术中继续前进.
使用Comet或Ajax Long Pull技术时 - 通常使用iframe.虽然iframe正在等待关闭的长连接,但浏览器正在旋转它的悸动(进度/加载指示器).
一些网站,例如etherpad.com,设法让它停止.
他们是如何做到的呢?
另见" WCF通过防火墙推送到客户端 "
我需要一个连接到WCF服务器的WCF客户端,然后当服务器上的某些数据发生变化时,客户端需要更新其显示.
因为客户端和服务器之间可能存在防火墙.
当我写客户端和服务器时,我不需要将解决方案限制为仅使用肥皂等.
感谢Drew Marsh提供的关于如何在WCF中实现长轮询的最丰富的答案.但是我认为WCF的主要"卖点"是你可以通过配置在配置文件中使用的通道来做这种事情. 例如,我想要一个逻辑上只有两个但只是物理传入的频道.
看起来HTML 5中的Websockets将成为服务器推送的新标准.
这是否意味着服务器推送被称为Comet的黑客将被淘汰?
当所有主流浏览器中的Websockets即将推出(1 - 2年)时,我是否有理由学习如何实现彗星?
然后我可以使用Beaconpush或Pusher直到那时为止?
comet ×10
http ×3
ajax ×2
java ×2
websocket ×2
.net ×1
chat ×1
django ×1
dwr ×1
gmail ×1
html ×1
iis ×1
jquery ×1
keep-alive ×1
loading ×1
long-polling ×1
networking ×1
php ×1
progress ×1
server-push ×1
servlet-3.0 ×1
spring-mvc ×1
tcp ×1
throbber ×1
wcf ×1