2012-01-06 20 views
16

好吧,有关于websockets的一些信息。这项技术本身是惊人的,毫无疑问在这个事实。之前,我将开始使用他们在我的应用我只是希望社会来回答这些问题:Websockets。互联网的丢失,保持活力的消息,应用程序的体系结构等

” ......为了保持存在,应用程序可以在WebSocket的,以防止它发送保持活动的消息由于空闲超时而被关闭......“

”......理想情况下,WebSocket的未来版本将支持超时发现,因此它可以告诉应用程序保持活动消息的时间段......“

  1. 这感觉就像是似曾相识。之前我们不得不轮询服务器一次%period_time%以获取所需的更新信息。使用websocket,我们必须轮询websocket服务器一次%period_time%与保持活动消息以确保互联网连接仍然活着/ websocket服务器仍在工作。利润是多少?

    关于这些keep-alive消息的另一件事。 Websocket协议具有比HTTP(S)使用更少流量的优势。如果我们发送保持活动的消息,似乎流量优势消失。或者可能不是?

  2. 我应该如何处理在我的应用程序中丢失互联网如果我使用websockets?我的意思是当互联网连接突然丢失(我的意思是没有“navigator.offline”事件发生)的真实情况。我应该使用某种setTimeout函数来寻找保持活动的消息还是有更好的方法来处理这种情况?

  3. REST让我们清楚了解应用程序应该如何工作以及请求的外观。在websocket驱动的应用程序中做这件事的最好方法是什么?我应该只有(说)与request.action字段它的JSON编码的消息吗?该应用程序应该如何执行PUT请求?在REST模型中有URL资源来处理这个问题,所以我应该使用这些方法的组合还是简单地使用?

+0

此问题不太适合我们的问答格式。我们期望答案通常涉及事实,参考或具体的专业知识;这个问题可能会征求意见,辩论,争论,投票或扩大讨论。 – Jakub 2012-01-06 13:50:23

+3

@Jakub我认为stackoverflow是获得关于这项技术的答案的最好方法。我只想听听那些知道这些问题答案的人。实际上不需要辩论。 – 2012-01-06 13:55:09

回答

16

我想大部分的问题都可以通过理解WebSockets的真正目的来阐明。 WebSockets的主要目的不是为了替换已经存在并且运行良好的任何东西。例如,它并不是AJAX的低开销版本。其目的是在浏览器和服务器之间提供双向,低延迟,全双工通信通道。它的真正目的是启用一个新的Web应用程序域,或者改进目前滥用HTTP的域来实现双向通信。

考虑到这一点,让我对你的要点评论:

  1. 周期性的WebSockets平/乒乓球消息的目的是双重的:保持通道通过TCP超时,更被关闭快速检测通道何时关闭(这在历史上是TCP的一个弱点)。 HTTP/AJAX轮询的目的是为了解决HTTP不是双向的(即客户端轮询给服务器发送数据的机会)。 WebSocket ping/pong帧通常是2个字节长。 HTTP/AJAX轮询需要完整的头文件,cookie等,每个请求/响应可以轻松地总计超过千字节。即使您通过WebSockets每秒发送一次ping/pong 10次,您仍然不可能每2秒钟进行HTTP/AJAX轮询的开销。但是请注意,应用程序无法发送ping/pong消息。这是在浏览器和服务器之间。

  2. 如果您失去了互联网连接,您将收到一个onclose事件。如果您的浏览器没有为您执行ping/pong消息,则在网络连接关闭后您尝试发送消息时,您可能不会收到关闭消息。

  3. 我不会用WebSockets替换一个可用的RESTful服务。你可能会做很多映射工作,但可能收效甚微(再一次,WebSockets不能取代已经很好的工作)。我可以想象,您可能会遇到以下情况:REST用于状态转移,WebSockets用于事件通知。例如。服务器发送一个WebSocket消息,指示“发生了某些变化”,这会触发客户端发出REST请求以找出更改。

更新

澄清:你可以做REST过的WebSockets但它是理念上的不匹配。 REST是一种架构风格,对底层的传输系统不加评论。它是一种受限制的架构:“客户端 - 服务器”,“无状态”,“可缓存”,“分层系统”,“按需代码”和“统一接口”。 WebSocket不受这些限制;它是一个通用的消息传输系统。您可以将WebSockets限制为RESTful,但在您理解REST和WebSockets之前不要这样做,并且可以确定何时这样做。

+0

关于第三点的一个问题:websocket中的二进制数据发送机会是什么意思?也许这是应该取代REST的东西? – 2012-01-06 17:10:52

+0

WebSockets支持发送UTF-8字符串或原始二进制数据。帧的类型基于send()调用中使用的对象。如果您发送一个字符串,那么它将作为UTF-8文本框发送。如果您发送Blob或Typed Array(ArrayBuffer),则它将作为二进制帧发送。如果服务器向客户端发送二进制帧,则从onmessage()接收的对象类型取决于WebSocket对象(“blob”或“arraybuffer”)上的binaryType属性的设置。如果你需要低延迟的二进制数据传输比WebSockets很好的匹配。 – kanaka 2012-01-06 18:25:43

+0

已将评论更新为答案。 – kanaka 2012-01-06 18:36:40

4

“请停止说出常见词语,并告诉除了聊天和股票交易应用程序外,在生产就绪应用程序中使用websockets有多少实际案例?

我在太空飞船动作游戏中使用了多人游戏支持的websockets。 Websockets是一项非常酷的技术,但我也发现它令人沮丧不可预知 - 这可能只是我作为新手而犯的一些错误。如果我有更多的错误发生,我可能会建立一个链接,但它崩溃太多了,所以我现在没有在活动的服务器上。

我想这会使它成为一个无生产就绪的应用程序,但假设我不明白为什么有更多经验的人不会做得很好。

+0

这里有两个:http://hacks.mozilla.org/2012/03/browserquest/,http://www.html5games.net/puzzle/word-squared/ – Nik 2012-05-09 16:26:14