1

我们计划使用 Websockets 技术制作一个基于 HTML5 的聊天应用程序。

所以我的问题是:

  1. 目前有哪些浏览器支持原生Websockets

  2. 如果浏览器不支持它,什么是可能的优雅回退?

  3. 有没有可以提供帮助的polyfill?

问候,

4

5 回答 5

12

目前有哪些浏览器支持原生 Websockets?

正如前面的答案所指出的。

看:

如果浏览器不支持它,什么是可能的优雅回退?

如果您的实时 Web 服务器仅支持 WebSockets,那么下一个最佳选择是使用web-socket-js,它是一个基于 Flash 的 polyfill,它创建一个对象,该对象以与本机对象WebSocket相同的方式进行交互。WebSocket

其他回退 -需要由您的实时 Web 服务器支持并由它提供的 JavaScript 客户端库管理- 按最佳到最坏的顺序排列:

  1. EventSource - 来自服务器 -> 客户端的单个流式连接。可以使用第二个 HTTP 请求来实现双向通信。
  2. HTTP Streaming - 使用两个连接来模拟双向连接。消息通过持久的“流”连接服务器“推送”-> 客户端
  3. HTTP 长轮询- 也使用两个连接。但是,服务器 -> 客户端被打开,一直保持到有新消息可用或发生超时。然后关闭它,如果设置了任何数据,它会在响应中传递。
  4. 标准 HTTP 轮询- 效率低得多,并且由于大量可能浪费的请求。但是,如果您的应用程序提供的更新不经常发生,并且轮询请求之间的数据是否“过时”也没关系,那么这可能是一个可以接受的解决方案。这里没有“推动”。

选项 1. 和 2. 可以通过多种不同的方式实现,具体取决于 Web 浏览器。这就是使他们成为“黑客”的原因。我们现在有用于双向通信的 WebSocket 和 EventSource(服务器发送的事件),它与 HTTP 流非常相似,但它还支持自动重新连接。

有没有可以提供帮助的polyfill?

是的,请参阅前面提到的 web-socket-js 。

对于 PHP,您最好的选择是Ratchet。它不在 Apache 中运行,因此不会受到同样的限制——它不是在构建时考虑到请求/响应范式。

我现在看到的最常用的解决方案是:

对于其他选项——包括像Pusher这样的托管服务(我在撰写本文时为之工作)——请查看我正在维护(并接受贡献)的这个实时网络技术指南。

于 2013-06-03T15:02:00.553 回答
1

正如 NullPoiиteя 和 Orangepill 所指出的,您可以查看caniusehtml5please。所以这是你的第一点/

您的第二点和第三点更多的是备用选项。那么你可以使用轮询。(有关更多信息,请参阅此答案)。

好吧,这不是你的问题,而是你应该考虑的一点(因为你在 php 下标记了它)。只要用户处于活动状态,Websockets 就具有活动连接。PHP 不适合这个,你的服务器会淹没在连接中,而且一个恶意的人可以很容易地确保服务器被淹没。

这是因为如果你想要它,你需要将超时限制设置为 0(所以永远不要)。因此,您的服务器将堆叠请求直到它已满。(我不知道它是如何充当连接的)。

如果你不想使用 websockets 和 PHP,你应该看看pusher。我将此服务用于我自己的聊天内容。它就像魔术一样工作,将所有困难的事情从你身上带走。

我希望这些信息可以帮助您开发一个 nive 应用程序

于 2013-06-03T06:32:53.370 回答
0

如果你不想为了学习而构建它,你可以使用node.js,它是一个很好的起点,你也可以找到很多资源,引导你从头开始。

但对我来说,我更喜欢在官方 PHP 网站的帮助下使用 PHP Web 套接字服务器进行通信,将 javascript 用于客户端,您可以开始构建您的 Web 套接字服务器。

于 2013-10-21T06:41:30.327 回答
0

Faye 很棒,我喜欢 Pusher,但我想要一些免费且易于实现的东西,我可以在自己的服务器上进行管理。在开始学习 Node.js 之后,我对 Faye 印象深刻。它为 websockets、http 提供了很好的支持,但我喜欢你可以使用 Bayeux 协议。

http://faye.jcoglan.com/node.html

于 2013-06-04T03:23:39.787 回答
0

我们已经做了这样的事情,构建一个与 html5 web sockets 连接的稳定的 php socket server 是一项艰巨的任务。

关于我们的常见问题解答的一些信息:http ://www.livesupportrhino.com/faq/c/4/rhino-websocket

于 2014-02-28T05:20:10.037 回答