2013-10-17 111 views
0

我刚开始学习Node.js,当我正在学习fs.watchFile()方法时,我想知道是否可以有效地构建聊天网站(和fs.writeFile()),例如Socket .IO这是稳定的,但我相信不是100%稳定(包括闪存在内的多个回退)。Node.js没有Socket.IO聊天

使用fs.watchFile也许也可以用于简单地保留聊天记录(因为JSON会在现场使用)。

可以用JSON格式化聊天文件,使得只有最后一个聊天的消息被引导到DOM(或者当文件被更新时使其有效地“提取”消息)。

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

回答

2

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

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

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

+0

我明白了,这样就像使用AJAX和setIntervals在数据发生变化时轮询数据一样,可以回溯到石器时代。我将直接使用socket.io并在MongoDB中存储聊天记录。谢谢。 –

+0

这是一个好主意 - Socket.IO也经过了战斗测试,并且可以通过发布/订阅商店(如Redis)进行横向扩展。祝你好运! – hexacyanide

+2

+1。另外值得注意的是,如果你愿意,可以使用Socket.io作为两台服务器之间的传输器:) – kamituel

4

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

您通常可以在客户端执行的操作是尝试使用Web套接字。如果浏览器不支持它们,请尝试使用XMLHttpRequest。如果失败,则回退到Flash。这需要很多编程,而且它也必须由node.js服务器来处理。 Socket.io为你做到了这一点。

另外,socket.io非常稳定。回退到Flash并不是因为它不稳定,而是由于缺少浏览器对更好解决方案的支持(如Web套接字)。

+0

谢谢,我会直接与socket.io –

+0

你怎么做与AJAX聊天?连续轮询服务器? – rocketspacer

+1

@nmtuan要清楚 - 一个人不会与AJAX聊天,而是“超越AJAX” - 这意味着AJAX不是通信方面的一方,而是沟通的方式。因此,要从服务器向浏览器发送通知,您通常会使用WebSockets,AJAX或Flash。在AJAX的情况下,是的,服务器会连续使用长寿命请求进行轮询,其中服务器只有在浏览器有一些新数据时才会作出响应(当然,这比因超时而更复杂一点)。 – kamituel

0

您可以使用JavaScript的setTimeout和setInterval

长池

基本上长池在阿贾克斯传请求和服务器的性反应的工作时间使用长轮询方法。

如果没有通知或消息,服务器会在一定时间后(如50秒后)响应,否则当客户端获得响应客户端时,它会响应数据并从客户端响应javascript提供另一个新的更新请求并等待响应这个过程是无止境的,直到服务器运行