2010-07-08 24 views
4

我正在阅读很多关于HTML5的内容,我特别喜欢网络套接字,因为它们促进了Web服务器和Web浏览器之间的双向通信。http服务器如何处理html5 web套接字?

但我们继续阅读有关铬,歌剧,火狐,Safari浏览器准备html5。哪个Web服务器准备好使用Web套接字功能?我的意思是,Web服务器能够启动今天的后续通信吗? Google自己的Appengine怎么样?

如何编写一个示例Web应用程序,以便在Java中利用此功能?

回答

10

Web服务器和浏览器之间的双向通信并不新鲜。如果将新的答案发布到您正在阅读的问题中,堆栈溢出会立即执行此操作。使用现有技术实现套接字式行为有几种不同的策略:

  • AJAX短轮询:连接到服务器并询问是否有任何新消息。如果不是,请立即断开连接,并在短暂间隔后再次询问。当您不想让很多长时间运行的闲置连接对服务器开放时,这很有用,但这意味着您将只接收与轮询间隔一样快的新消息,并且会产生建立每次轮询时新的HTTP连接。
  • AJAX长轮询:连接到服务器并保持连接处于打开状态,直到有新消息可用。这使您可以快速交付新消息和不太频繁的HTTP连接,但会导致服务器上更长时间的空闲进程。
  • Iframe长轮询:与上面相同,只能使用隐藏的iframe而不是XHR对象。当您想要进行跨站点长时间轮询时,可用于绕过同源策略。插件:Flash的XMLSocket,Java小程序等可用于建立更接近真正的低级持久性套接字的浏览器。

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') 
3

码头,例如,支持自7版本的功能:Jetty Websocket Server

谷歌的App Engine为这个还计划。他们甚至在Google I/O 2010上进行了这方面的演示,但尚未投入生产。请参阅ticket #377

相关问题