仅使用 websockets 构建整个站点(通过 socket.io 和 node.js,没有 Ajax)?

Posted

技术标签:

【中文标题】仅使用 websockets 构建整个站点(通过 socket.io 和 node.js,没有 Ajax)?【英文标题】:Build a whole site using just websockets (via socket.io and node.js, no Ajax)? 【发布时间】:2011-12-23 21:52:09 【问题描述】:

这可能吗?有人试过吗?

使用 websockets 意味着没有 httpheaders 被交换(就像在 Ajax 请求中一样),因此页面显示速度肯定会提高,但是即使没有任何事情发生,您也可以通过套接字保持与服务器的连接,是随着用户数量的增加,这有害吗?

在客户端和服务器之间保持连接的情况下,服务器仍然可以处理连接在同一端口上的其他客户端吗?

【问题讨论】:

非常有趣的问题。 +1 我可能会提到的一件事是,您可能知道,WebSocket 支持在许多客户端中仍然很薄弱或不存在,因此兼容性将是一个主要因素。 看socketstream。这是一个基于 websockets 构建的整个网站。我发送一个打开 websocket 连接的小 html 文件,然后将所有资源/资产通过管道传输到 websocket @Tom:实际上,WebSockets 现在几乎可以在所有浏览器上使用。 ios 从 4.2 开始支持它。自 5 以来的 Chrome。自 5-ish 以来的 Safari。自 6.0 以来的 Firefox。 IE 将在 10 中支持它。Opera 也很快。对于所有其他(和较旧的浏览器),有web-socket-js。注意:目前有两个主要的协议版本 Hixie-76 和 HyBi-*,但大多数 WebSocket 服务器都透明地支持(这样做相对容易),所以这实际上不是什么大问题。 【参考方案1】:

这绝对是可能的,但我还没有尝试过。您将获得延迟提升,但带宽提升不会显着。真正的问题不是服务器资源(在大多数情况下,通过 AJAX 持续轮询服务器可能在服务器上更难),但 AJAX 确实解决了很多问题(尤其是您将遇到的问题)增加),因此您将重建很多东西以供自定义使用。

除非您确实遇到延迟问题,否则我建议您使用标准 AJAX。或者仅将 WebSockets 用于实际需要低延迟的应用程序部分,这样您就不会重新创建所有***。

是的,能够让多个客户端同时连接到一个侦听端口是可能的并且一直都在完成(例如,您的 Web 服务器几乎肯定会在端口 80 上这样做)。您的 WebSocket 服务器必须正确处理传入的连接(事件、线程或多进程),但这几乎是标准的公平(谷歌“套接字编程 YOUR_LANGUAGE”)。

【讨论】:

【参考方案2】:

仅使用 websockets(通过 socket.io 和 node.js,没有 Ajax)构建一个完整的站点? 这可能吗?有人试过吗?

我没听说过这种东西,但是很多网站都在密集使用Ajax。

使用 websockets 意味着没有 httpheaders 被交换(比如 在 Ajax 请求中),因此肯定会提高页面速度 显示,但是您使用套接字连接到 服务器即使什么都没有发生,这是否有害 用户数量增加了?

首先,并非所有浏览器都支持本机 websockets,只是 a few 实际上这样做可能您的大多数用户将不得不做一些长池或类似的事情。

在客户端和服务器之间保持连接的情况下,服务器可以 仍在处理连接在同一端口上的其他客户端?

你就在这里,但我想如果你使用的是 Node.js 之类的东西并且没有连接数以万计的用户,这不会是一个问题。

【讨论】:

注意事项:web-socket-js 项目为 WebSockets 提供了基于 Flash 的 shim/polyfill,这意味着任何支持 Flash 的浏览器也可以具有 WebSockets。由于 iOS 从 4.2 开始就有 WebSockets,这实际上意味着 WebSockets 现在几乎无处不在。第二点:对于不频繁的小消息,设计良好的服务器可以轻松处理数万个 WebSocket 连接(尤其是与为数千个并发客户端处理轮询 AJAX 连接的服务器相比)。 是的,您可以使用 Flash WebSockets,这是真的。我认为最好在没有 WebSockets 的情况下开始,然后将应用程序的每个部分与 WebSockets 集成(例如,如果您有一个博客,首先创建您的常规网站,然后添加实时 cmets,然后是实时帖子等,逐步构建应用程序)。【参考方案3】:

看看 SocketStream: https://github.com/socketstream/socketstream

SocketStream 是一个新的 Node.js Web 框架,专门用于创建单页实时网站。

会有一些资源的初始加载,但 WebSockets 将广泛用于客户端 服务器通信。

【讨论】:

【参考方案4】:

一个迟到的答案,但是......

我最近推出了我的娱乐网络应用程序 (jounce.space),它使用 websocket 进行除身份验证之外的所有操作。 websocket 用于服务器推送的数据和客户端发起的事务。

该网站提供多种不同的台球类娱乐活动。玩家用一根将鼠标连接到球的松紧带来控制她的球,而不是球杆。与台球或台球不同,您可以连续玩:无需轮流。

松紧带解决(或最小化)延迟问题,因为玩家在通过松紧带进行控制时自然会期望延迟。 服务器运行游戏模型,每 40 毫秒通过 websocket 发送更新的球位和游戏事件。每台客户端机器都会以其当前的鼠标位置进行响应。

除了传输实时游戏数据外,套接字还发送/接收玩家到达和离开、游戏通知和聊天。 数据采用 JSON 格式,例如每 40 毫秒发送给每个客户端:



    "frameN": frame_sequence_num,

    "cpuLoad": frame_update_us/frameRate,

    "players":

        <playerId>:[posX, posY, MouseX, MouseY],

        .

        .

        .

    


有时帧数据无序到达,因此如果 frame_sequence_num 小于前一个,则忽略该帧数据。 将每个玩家的鼠标位置发送给所有玩家,让每个人都能看到彼此的松紧带。

Jounce.space 在这篇文章中已经上线。访问并“查看源代码”以更深入地了解客户端。呃,警告,代码还不漂亮;这是一个大杂烩,但效果很好(MSIE 除外)。用 golang 编写的服务器托管在 openshift.redhat.com。

【讨论】:

以上是关于仅使用 websockets 构建整个站点(通过 socket.io 和 node.js,没有 Ajax)?的主要内容,如果未能解决你的问题,请参考以下文章

Websocket API取代REST API?

Codeigniter 站点仅显示一个包含的视图

Django站点管理——管理站点

实验使用apache构建虚拟主机

当数据库中的某些内容被修改时,仅通过 WebSockets 通知特定用户

Joomla 组件输出 - 仅模板 - 无默认站点骨架