【问题标题】:Node.js chat without Socket.IO没有 Socket.IO 的 Node.js 聊天
【发布时间】:2013-10-17 05:27:27
【问题描述】:

我刚开始学习 Node.js,在学习 fs.watchFile() 方法时,我想知道是否可以使用它(和 fs.writeFile())有效地构建聊天网站,例如 Socket.IO,它是稳定,但我相信不是 100% 稳定(有几个后备方案,包括闪存)。

使用fs.watchFile 也可以非常简单地保存聊天历史记录(因为当场使用 JSON)。

聊天文件可以采用 JSON 格式,这样只有最后一个聊天者的消息才会被带到 DOM(或任何使文件更新时“获取”消息变得高效的方法)。

我还没有尝试过,因为我仍然需要了解更多关于 Node 的知识,甚至更多地能够将它与 Socket.IO 进行比较,但你对此有何看法?这会是一种高效/稳定的聊天方式吗?

【问题讨论】:

    标签: javascript json node.js socket.io


    【解决方案1】:

    fs.watchFile() 可用于监视本地文件系统(在服务器上)中文件的更改。这不能解决您在浏览器中更新所有客户端聊天消息的需要。您仍然需要 Web 套接字、AJAX 或 Flash(或处理所有这些的 socket.io)。

    您通常可以在客户端中尝试使用 Web Sockets。如果浏览器不支持,请尝试使用 XMLHttpRequest。如果失败,则回退到 Flash。要做很多编程,而且还必须由 node.js 服务器处理。 Socket.io 会为您做到这一点。

    此外,socket.io 非常稳定。回退到 Flash 并不是因为它不稳定,而是因为缺乏对更好解决方案(如 Web Sockets)的浏览器支持。

    【讨论】:

    • 谢谢,那我就直接用socket.io了
    • 你如何使用 AJAX 聊天?连续轮询服务器?
    • @nmtuan 说清楚 - 聊天不是“与 AJAX”,而是“通过 AJAX” - 这意味着 AJAX 不是沟通的一方,而是沟通的手段发生。因此,要从服务器获取通知到浏览器,您通常会使用 WebSockets、AJAX 或 Flash。在 AJAX 的情况下,是的,服务器将使用长期请求持续轮询,其中服务器不会响应,直到它为浏览器提供一些新数据(嗯,由于超时,它比这更复杂一些)。
    【解决方案2】:

    将聊天文件存储在平面文件 JSON 中并不是一个好主意,因为如果要操作文件,则必须解析和序列化整个 JSON 对象,随着 JSON 对象大小的增加,这将变得非常慢。文件系统模块的监视方法也不适用于所有操作系统。

    您也无法将 Node.js 与 Socket.IO 进行比较,因为它们是完全不同的东西。 Socket.IO 是一个 Node 模块,用于在浏览器和服务器之间进行实时传输。你需要什么取决于你在做什么。如果您需要聊天记录,那么您应该使用 MongoDB 或 MySQL 等数据库。监视文件的更改不是一种有效的方法,您应该在收到消息时发送它们。

    总之,不,使用fs.watchFile()fs.writeFile() 是一个非常糟糕的主意,因为并发文件写入会发生竞争条件,此外fs.watchFile() 使用轮询来检查文件是否已更改。您应该改为使用 Socket.IO 并将消息推送到其他客户端/将它们存储在数据库中在收到它们时

    【讨论】:

    • 我明白了,这类似于使用带有 setIntervals 的 AJAX 在数据发生变化时轮询数据,有点像回到石器时代。我将直接使用 socket.io 并将聊天存储在 MongoDB 中。谢谢。
    • 这是个好主意 - Socket.IO 也经过了实战考验,并且可以通过 Redis 等发布/订阅存储进行水平扩展。祝你好运!
    • +1 来自我。另外值得注意的是,如果需要,Socket.io 也可以用作两台服务器之间的传输:)
    【解决方案3】:

    您可以使用 javascript setTimeout 和 setInterval 使用长池方法

    长池化

    处理 Ajax 请求和服务器响应时间的基本长池化。

    如果没有通知或消息,服务器将在一定时间后(如 50 秒后)响应,否则它会在客户端收到响应时从客户端响应数据和客户端 javascript 再次请求新更新并等待直到响应在服务器运行之前,进程是无穷无尽的

    【讨论】:

      猜你喜欢
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多