Socket.IO 对 Node.js 有啥作用

Posted

技术标签:

【中文标题】Socket.IO 对 Node.js 有啥作用【英文标题】:What role does Socket.IO have with Node.jsSocket.IO 对 Node.js 有什么作用 【发布时间】:2014-11-21 18:29:42 【问题描述】:

我对 JS 世界及其丰富的库还很陌生。我正在寻找一个涉及客户端和服务器之间的网络通信(套接字)的项目。在一个拥有大量图书馆的世界中,我无法决定使用哪个图书馆。我正在寻找能够带来效率和稳定性的东西。

有人告诉我,Node.js 就像您(作为开发人员)和 Socket.IO 之间的中间人。我被告知这是一个巨大的框架,你可能至少有一半不会使用。有人告诉我,为了最大限度地提高效率,最好使用 Socket.IO 来制作自己的功能。我自己做了一些研究,发现 Socket.IO 需要 Node.js,而 Node.js 不需要 Socket.IO。这与我被告知的完全相反。那我发现大部分开发者同时使用 Socket.IO 和 Node.js?

就像我说的,我是新手,但我找不到合适的资源来帮助我以最高效率完成客户端和服务器之间的 websocket 通信,或者至少解释 Socket.IO 和 Node 之间的区别.js。如果这里有人可以,请告诉我!我将不胜感激。

【问题讨论】:

【参考方案1】:

node.js 是一个通用的基于 javascript 的运行时环境(有点类似于其他语言运行时,如范围内的 python)。您可以在其中创建甚至不使用网络的应用程序。它通常用作创建的 Web 应用程序的 Web 服务器,并具有一组出色的工具和丰富的附加组件库。它不需要socket.io。

socket.io 是一个特定的库,用于在客户端和服务器之间启用类似 web-socket 的通信(例如,聊天室应用程序就是典型示例)。 socket.io 的服务器端假定一个 javascript 运行时(因为它是用 javascript 编写的),所以这通常意味着 node.js(尽管我不确定是否可以替换不同的 JS 运行时)。

您可以将node.js 视为平台,将socket.io 视为执行在该平台上运行的特定工作的特定工具。如果您需要客户端和服务器之间的 Web 套接字连接,您可以使用 socket.io(在 node.js 之上)。

如果您需要 node 擅长的任何其他事情,但不需要 websocket 连接,您将只使用node.js


websockets 本身可以在没有socket.io 和node.js 的情况下在服务器端进行编程。它们可以用 Strait C++ 或 Java 编程。但是socket.io(在节点中运行)提供了一种非常简单的设置它们的方法,因为socket.io 库在一个库和一个 API 中涵盖了客户端和服务器,并且它们都使用相同的语言(javascript)。查看 socket.io 网站上的聊天室应用程序示例,您将不太可能找到任何其他解决方案,可以用尽可能少的代码行并在客户端和服务器上使用相同的界面。

如果您只是设置 websocket 服务器(没有任何类型的 web 服务器或 web 应用程序),您仍然可以使用 node 和 socket.io 并将其仅用于 websocket 服务器,它仍然会非常有效。虽然 node 能够做很多其他事情,但如果您不配置和安装所有其他事情,它们不会花费您任何成本 - 它们只是未运行的未使用功能。

我应该补充一点,socket.io 库所做的另一件事是它处理客户端和服务器之间的自动协商,以找到客户端和服务器进行通信的最佳通道。如果 websockets 可用,那么 socket.io 可能会使用它们,但是如果 web sockets 不可用,socket.io 有替代方法可以工作(即使在旧浏览器中)。这个功能在 socket.io 中是免费的,你甚至不需要做任何事情。


如果您对此不完全清楚,websockets 通常用于在客户端和服务器之间提供实时通信。虽然客户端可以随时通过 ajax 调用或网页请求从服务器请求数据,但 websockets 允许的是客户端和服务器之间的双向实时通信,websockets 的最大优点是服务器可以发送一个客户端连接时随时获取实时数据。

例如,我有一个网页,只要网页打开,它就会从我的服务器接收实时数据。网页通过典型的 node.js 网络服务器安装提供服务,但实时数据通过 websocket 连接从服务器发送到客户端。

此外,如果客户端和服务器之间发生闲聊,websockets 可以比一系列 ajax 调用更有效率,因为使用 websocket,连接打开一次并重复使用,而使用 ajax,每个连续的 ajax 调用就像一个新的连接。

【讨论】:

【参考方案2】:

Node.js 是一个运行时环境。这是一个带有standard library 的javascript 引擎,它围绕异步I/O 构建。它与 Java、Python、Ruby、.NET 等在许多其他 Web 应用程序中所起的作用相同。

有人告诉我这是一个巨大的框架,你可能至少有一半不会使用。

也许大多数人从不使用大多数标准库,但我认为 Node.js 并不比其他运行时更适用。 “框架”不是一个准确的词来描述它。

有人告诉我,为了最大限度地提高效率,最好使用 Socket.IO 来创建自己的功能。

谁告诉你这是错误的,或者是为了最大限度地提高效率,你最好使用 [Node.js 和] Socket.IO [而不是其他解决方案]。许多其他非 Node.js 解决方案需要每个连接一个线程或进程,这限制了服务器可以处理的同时连接数。 Node.js 是围绕异步 I/O 构建的,这更适合同时打开多个连接,而 Socket.IO 是 Node.js 使用 WebSockets 的库。

【讨论】:

【参考方案3】:

TL;DR:Socket.IO 可以在您的客户端和服务器之间实时触发事件,因此您无需重新加载页面即可注意到某些变化。 这可用于“实时”应用程序,例如协作绘图、实时聊天、在线游戏等等!

【讨论】:

以上是关于Socket.IO 对 Node.js 有啥作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 node.js 中接收 socket.io 客户端事件?

engine.io 和 socket.io 有啥区别?

Socket.IO 和 Firebase 有啥区别?

node.js、socket.io 和 SSL

使用node.js实现多人聊天室(socket.ioB/S)

Node.js 找不到 socket.io - 得到 404