我正在阅读很多关于HTML5的内容,我特别喜欢网络套接字,因为它们促进了Web服务器和Web浏览器之间的双向通信。http服务器如何处理html5 web套接字?
但我们继续阅读有关铬,歌剧,火狐,Safari浏览器准备html5。哪个Web服务器准备好使用Web套接字功能?我的意思是,Web服务器能够启动今天的后续通信吗? Google自己的Appengine怎么样?
如何编写一个示例Web应用程序,以便在Java中利用此功能?
我正在阅读很多关于HTML5的内容,我特别喜欢网络套接字,因为它们促进了Web服务器和Web浏览器之间的双向通信。http服务器如何处理html5 web套接字?
但我们继续阅读有关铬,歌剧,火狐,Safari浏览器准备html5。哪个Web服务器准备好使用Web套接字功能?我的意思是,Web服务器能够启动今天的后续通信吗? Google自己的Appengine怎么样?
如何编写一个示例Web应用程序,以便在Java中利用此功能?
Web服务器和浏览器之间的双向通信并不新鲜。如果将新的答案发布到您正在阅读的问题中,堆栈溢出会立即执行此操作。使用现有技术实现套接字式行为有几种不同的策略:
HTML5套接字并没有真正改变可用的底层策略。大多数情况下,他们只是将已经使用的策略形式化,并允许持续连接被明确识别,从而更加智能地处理。假设您想要在移动浏览器上执行基于Web的推送消息。通常的长轮询,移动设备需要保持清醒状态才能保持连接。使用WebSocket,当移动设备想要进入睡眠状态时,它可以切断与代理的连接,并且当代理接收到新数据时,它可以唤醒设备并返回消息。
服务器端是开放的。要实现短轮询应用程序的服务器端,只需要某种按时间顺序的消息队列。当客户端连接时,他们可以将新消息从队列中移出,或者他们可以传递偏移量并读取比偏移量更新的消息。
实现服务器端长轮询是您的选择开始缩小的地方。大多数HTTP服务器专为短期请求而设计:连接,请求资源,然后断开连接。如果有300人在10分钟内访问您的网站,并且每个人需要2秒钟才能连接并下载HTTP资源,那么您的服务器在任何给定时间将平均打开1个HTTP连接。通过一个长轮询应用程序,您突然保持300倍的连接。
如果您正在运行您自己的专用服务器,您可能可以处理此问题,但在共享主机平台上,您可能会遇到资源限制,App Engine也不例外。 App Engine被设计为处理大量的低延迟请求,例如,短投票。您可以在App Engine上实施长时间轮询,但这并不合适;运行时间超过30秒的请求将被终止,并且长时间运行的进程会占用您的CPU配额。
App Engine的解决方案就是即将推出的Channel API。渠道API使用Google现有强大的XMPP基础架构实现长轮询。
Brett Bavar and Moishe Lettvin's Google I/O talk勾画出使用模式如下:
App引擎应用创建一个远程服务器上的一个信道,并返回它们通关到Web浏览器的信道ID。
class MainPage(webapp.RequestHandler):
def get(self):
id = channel.create_channel(key)
self.response.out.write(
{'channel_id': id})
web浏览器将频道ID到同一远程服务器建立经由IFRAME长轮询的连接:
<script src='/_ah/channel/jsapi'></script>
<script>
var channelID = '{{ channel_id }}';
var channel =
new goog.appengine.Channel(channelId);
var socket = channel.open();
socket.onmessage = function(evt) {
alert(evt.data);
}
</script>
当一些有趣的情况发生时,应用程序引擎应用可以推一个消息给用户的频道以及浏览器的长轮询请求将立即收到:
class OtherPage(webapp.RequestHandler):
def get(self):
# something happened
channel.send_message(key, 'bar')
码头,例如,支持自7版本的功能:Jetty Websocket Server
谷歌的App Engine为这个还计划。他们甚至在Google I/O 2010上进行了这方面的演示,但尚未投入生产。请参阅ticket #377