使用Node.js能否制作聊天应用程序而不使用socket.io?

4

我想在 nodejs 中制作一个小型聊天应用程序。

但是无论在哪里,我发现要实现这个功能,需要使用 socket.ioNode 一起使用。

由于 Node 也是为了推送通知而创建的,所以考虑是否有可能纯粹地使用 Node 创建聊天应用程序呢?

谢谢!


1
不确定“purely in node”是什么意思。 - Dave Newton
“purely in node” 的意思是:由于 Node 也是为推送通知而创建的,所以为什么要使用其他库呢 :>) - vijay
2
肯定是可能的,但取决于您的要求。为什么不使用socket.io?如果您想最终获得与socket.io相同的功能,那么您最终会编写一个类似于socket.io的东西。但问题是,当socket.io提供功能时,为什么要花时间去做这件事呢?node是为推送通知而创建的,但socket.io的功能并没有内置在其中。您必须从头开始编写它。 - Farid Nouri Neshat
2个回答

6

我希望在node.js中制作一个小型聊天应用程序。但是无论在哪里,我都发现要实现此功能,需要使用socket.io与node一起使用。由于node也是为推送通知而创建的,因此如果可能的话,想知道如何纯粹地在node中创建聊天应用程序。

是的,可以创建一个不使用socket.io支持聊天的node.js应用程序。您有以下选择:

  1. 使用直接的webSocket向客户端“推送”数据。你需要找或编写自己的服务器端代码来处理 webSocket 协议,因为这样的代码不是 node 默认内置的。ws module 是其中一种库。如果使用普通的 webSocket,你可能需要自己实现 socket.io 所实现的一些功能(例如自动重连)。

  2. 寻找其他构建在 webSocket 之上的某个 library(除了 socket.io),它可以让你向客户端推送数据。

  3. 发明自己的替代品,用于 webSocket(可能是客户端轮询或长轮询),并对其进行编码。这就是在 webSockets 存在之前所做的。它比持续连接的 webSocket 不高效得多。

所有这些选择都涉及编写一些已经为您在 socket.io 中编写的代码,因此大多数开发人员更愿意使用已经工作且经过测试的解决方案,而不是自己重新实现它。


要深入了解您的问题,您需要定义“纯粹在节点中”的含义才能真正回答这个问题。这不是一个明确定义的术语。 socket.io库只是一个用Javascript编写的库,就像您可以在node.js中使用的成千上万的其他库一样,以完成您的工作。
正如您在node编程中很快就会发现的那样,在默认的node实例中几乎无法做任何事情而不加载其他库。其中一些库随着node的默认安装而来(例如fs库或http库),而其他库则是在使用之前安装的库(通常只需键入"npm install socket.io"),然后var io = require("socket.io");
如果您不使用socket.io库,则需要一种机制来向客户端“推送”数据,以使聊天应用程序正常工作。唯一真正有跨浏览器支持的“推送”是webSocket。 webSocket就是socket.io使用的内容。您可以在没有使用socket.io的情况下从node使用webSocket,但您必须编写或找到实现可在node上运行的webSocket协议的代码(例如ws模块)。这种代码默认情况下不内置于node中。
如果您不打算使用webSocket,则没有其他跨浏览器方法可以将数据“推送”到浏览器客户端。我知道的您唯一的替代方案是浏览器轮询,它并不是真正的推送,而是通过定期询问服务器是否有任何新的特定客户端的内容来尝试模拟推送。对于直接轮询的改进是“长轮询”,在我们有实际推送webSockets之前发明的。
所有这些问题都已经在socket.io中得到解决,因此,除非您真的只想要自己的研究项目来重建类似的功能在自己的代码中,否则您可以通过像使用socket.io库这样的东西来使用已经完成的解决方案。
如果您对socket.io库有特定的反对意见,请解释一下这个反对意见,以便我们理解您在这里的真正目标。

@vijay - 这个回答解决了你的问题吗? - jfriend00
WebRTC是另一种“跨浏览器向浏览器客户端推送数据”的方法,但它并不是从Node服务器推送的。 - Cody

2

Node.js并没有内置服务器端Websocket实现,因此您至少需要引入一个可以实现它的包。

如果您不想使用socket.io,那么您可以选择使用ws,这也是socket.io底层使用的库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接