是否可以在不使用 socket.io 的情况下在节点中制作聊天应用程序

Posted

技术标签:

【中文标题】是否可以在不使用 socket.io 的情况下在节点中制作聊天应用程序【英文标题】:is it possible to make chat app in node without using socket.io 【发布时间】:2015-07-03 02:35:27 【问题描述】:

我想在nodejs.做小聊天应用

但是我发现要实现此功能的每个地方 node 都与 socket.io 一起使用

由于 node 也是在创建 推送通知 的情况下考虑到的,所以考虑

如果可能的话,如何纯粹在节点中创建聊天应用程序?

谢谢!

【问题讨论】:

不确定“纯节点”是什么意思。 "purely in node" 的意思是:创建节点时也考虑到了推送通知,所以就像为什么要使用其他库一样:>) 绝对有可能,但取决于您的要求。什么停止使用 socket.io?您希望最终获得与 socket.io 相同的功能,您最终将编写一些与 socket.io 不同的东西。但问题是,当 socket.io 提供功能时,你为什么要花时间做这件事呢?创建节点时考虑了推送通知,但其中没有包含 socket.io 功能。您必须从头开始编写它。 【参考方案1】:

我想在 nodejs 中制作小型聊天应用程序。但我发现的每一个地方 实现此功能的节点与 socket.io 一起使用。作为节点 也是在考虑推送通知的情况下创建的,所以思考如何 如果可能,纯粹在节点中创建聊天应用程序?

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

    使用直接的 webSocket “推送”到客户端。您需要查找或编写自己的服务器端代码来处理 webSocket 协议,因为默认情况下此类代码未内置到 node 中。 ws module 就是这样一个库。如果使用普通的 webSocket,您可能必须自己实现一些 socket.io 实现的功能,例如自动重新连接。

    查找其他一些构建在 webSocket 之上的库(除了 socket.io),可以让您将数据推送到客户端。

    发明自己的 webSocket 替代品(可能是客户端轮询或长轮询)并编写代码。这是在 webSockets 存在之前所做的。它的效率远低于持续连接的 webSocket。

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


要详细了解您的问题,您需要定义“纯粹在节点中”的含义才能真正回答这个问题。这不是一个定义明确的术语。 socket.io 库只是一个用 javascript 编写的库,就像您可以在 node.js 中使用的数千个其他库来完成您的工作一样。

正如您在节点编程中很快看到的那样,如果不加载其他库,您根本无法在默认节点实例中做很多事情。其中一些库带有默认安装的节点(例如fs 库或http 库),而其他库是您在使用之前安装的库(通常只需键入"npm install socket.io")然后@987654326 @。

如果您不打算使用 socket.io 库,那么您需要一种将数据“推送”到客户端的机制,以使聊天应用程序正常工作。唯一真正具有跨浏览器支持的“推送”是 webSocket。 webSocket 是 socket.io 使用的。您可以在不使用 socket.io 的情况下从节点使用 webSocket,但您必须编写或查找实现可以在节点上运行的 webSocket 协议的代码(ws module 就是这样一个库)。这样的代码默认不内置在node中。

如果您不打算使用 webSocket,那么就没有其他跨浏览器方法可以将数据“推送”到浏览器客户端。我知道的唯一另一种选择是浏览器轮询,这不是实际的推送,而是通过定期询问服务器是否有针对特定客户端的新内容来尝试模拟推送。对直接轮询的增强是“长轮询”,它是在我们使用 webSockets 进行实际推送之前发明的。

所有这些问题都已经在 socket.io 中解决了,所以除非你真的只是想让你自己的研究项目在你自己的代码中重建类似的功能,你最好在已经完成的解决方案的基础上使用类似的东西socket.io 库。

如果您对 socket.io 库有一些具体的反对意见,请解释该反对意见,以便我们了解您的真正目标。

【讨论】:

@vijay - 这回答了你的问题吗? WebRTC 是另一种“将数据‘推送’到浏览器客户端的跨浏览器方法”,尽管它不是从节点服务器推送。【参考方案2】:

Node.js 没有提供开箱即用的服务器端 Websocket 实现,因此您至少必须引入一个包。

如果您不想使用 socket.io,则可以遵循 ws,这是 socket.io 在后台使用的。

【讨论】:

以上是关于是否可以在不使用 socket.io 的情况下在节点中制作聊天应用程序的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不使用类变量的情况下在运行时在实例上创建 pyqtSignals?

是否可以在不使用整个框架的情况下在 PHP 中为 ORM 安装 Kohana 库?

是否可以在不唤醒手机的情况下在后台使用 iphone 注册和收集匹配的 UUID?

是否可以在不使用 python 移动终端行的情况下在同一位置打印“for循环”表?

是否可以在不使用继承的情况下在viewDidAppear上调用某些代码

是否可以在不使用临时文件的情况下在批处理文件中嵌入和执行 VBScript?