NodeJS聊天服务器广播:管道与写入

时间:2013-12-16 10:06:15

标签: node.js pipe serversocket

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

  • 向所有连接的用户广播用户的消息
  • 服务器基于 在'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);
                }
            }
        });            
    });

1 个答案:

答案 0 :(得分:1)

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

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