【问题标题】:NodeJS Chat Server Broadcast : Pipe vs WriteNodeJS 聊天服务器广播:管道与写入
【发布时间】:2013-12-16 10:06:15
【问题描述】:

我正在尝试为朋友/办公室制作一个简单的聊天服务器,它可以随时连接最多 50 人。

  • 用户的消息被广播给所有连接的用户
  • 服务器基于 on 'net' (TCP/IP)(稍后将移至 'http' 服务器)
  • 用户 通过 Telnet 连接到服务器

在效率和/或可靠性方面,以下哪种方法是广播消息的良好做法?

  • 通过管道将所有用户相互连接 (或)
  • 收到数据后,写给自己以外的所有用户?

示例管道服务器:

    var server = net.createServer(function(socket) {
        for(var i=0; i<sockets_list.length; i++){
            socket.pipe(sockets_list[i]);
            sockets_list.pipe(socket);
        }
        sockets_list.push(socket);
    });

示例写入服务器:

    var server = net.createServer(function(socket) {
        sockets_list.push(socket);

        socket.on('data', function(data){
            for(var i=0; i<sockets_list.length; i++){
                if(socket != sockets_list[i]){
                    sockets_list[i].write(data);
                }
            }
        });            
    });

【问题讨论】:

  • 如果您使用的是 node.js 0.10+,我建议使用 .on('readable', function () {});
  • 是的,我的版本是 0.10+,我是菜鸟,所以我还不知道“可读”,我现在就研究一下。谢谢。

标签: node.js pipe serversocket


【解决方案1】:

这种管道解决方案似乎非常错误,至少有三个原因:

  1. 您无法控制数据(安全、验证、身份验证、解析等)。这是不这样做的最重要的原因。您现在可能不需要它,但将来您会需要它。否则,我只会连接到您的服务器并通过发送垃圾邮件将其杀死。 ;)
  2. 新添加的套接字将向现有套接字发送数据,但现有套接字如何向新添加的套接字发送数据?此时逻辑变得复杂(您必须为每个套接字存储目标,并在发生新连接时更新所有目标)。更不用说使用该解决方案您将无法仅将数据发送到一个套接字。这是你不想要的限制。
  3. 您无法控制读/写频率(是的,我知道.pipe 会以某种方式处理它,但我不知道它的可靠性和可靠性)。您不必在每次数据可用时都读/写。事实上你不应该。您应该始终考虑连续读取/写入之间的最短时间。它会更高效、更安全(延迟半秒对用户来说没什么大不了的,他甚至都不会注意到)。

【讨论】:

  • (i) 是的,在安全方面,这太可怕了,但我更感兴趣的是连接的效率和可靠性。 (ii) 在示例中,您可以看到新套接字通过管道传输到现有套接字,并且在每次迭代时现有套接字也通过管道传输到新套接字。 (iii) 关于控制读/写频率的公平点。
  • @NitRed (ii) 哦,是的,我错过了。还有一件事:当套接字断开连接时,您将不得不处理这种情况,即.unpipe。至于性能:管道可能更有效,但价格太高了。而且写作确实表现不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2021-07-05
相关资源
最近更新 更多