Javascript Node.js广播两次

Javascript Node.js广播两次,javascript,node.js,Javascript,Node.js,我将介绍node.js的第一步。我正在尝试实现一个简单的聊天室来获取基本信息,但不明白为什么每次广播后,都会自动发送第二条(空)消息。这种行为大多数时候都会发生,但并不总是如此。我在Windows中使用Netbeans,并使用Putty来模拟客户端连接 控制台输出: Server running ::1:60616 joined ::1:60617 joined ----------- Broadcasting: hello ----------- Broadcasting:

我将介绍node.js的第一步。我正在尝试实现一个简单的聊天室来获取基本信息,但不明白为什么每次广播后,都会自动发送第二条(空)消息。这种行为大多数时候都会发生,但并不总是如此。我在Windows中使用Netbeans,并使用Putty来模拟客户端连接

控制台输出:

Server running    
::1:60616 joined    
::1:60617 joined
-----------
Broadcasting: 
hello
-----------
Broadcasting:


-----------
Broadcasting: 
goodbye
-----------
Broadcasting: 


-----------
客户1:

Hi ::1:60616!
    hello
goodbye
客户2:

Hi ::1:60617!
::1:60616 says hello::1:60616 says
::1:60616 says goodbye::1:60616 says
代码


您不能依赖原始
数据
事件向您呈现“全面”的数据块。它可能以碎片的形式出现,你不一定能控制这些碎片有多大,或者它们在特定的边界上分裂

但是,有些模块可以帮助您,例如,将数据拆分为单独(完整)行:


您不能依赖原始
数据
事件向您呈现“全面”的数据块。它可能以碎片的形式出现,你不一定能控制这些碎片有多大,或者它们在特定的边界上分裂

但是,有些模块可以帮助您,例如,将数据拆分为单独(完整)行:


谢谢,罗伯特。你的回答解决了这个问题。除此之外,我只需包含“os”模块并将“\n”替换为“os.EOL”,即可正确格式化客户端输出中的消息。@R.Costa哦,对,
数据(默认情况下)不会包含行尾。谢谢,Robert。你的回答解决了这个问题。除此之外,我只需包含“os”模块,并将“\n”替换为“os.EOL”,即可正确格式化客户端输出中的消息。@R.Costa哦,对,
数据
不会(默认情况下)包含行尾。
var net = require('net');

var chatServer = net.createServer();
var clientList = [];

console.log('Server running');

chatServer.on('connection', function (client) {

    client.name = client.remoteAddress + ':' + client.remotePort;
    client.write('Hi ' + client.name + '!\n');

    console.log(client.name + ' joined');

    clientList.push(client);

    client.on('data', function (data) {

        console.log('Broadcasting: ');
        console.log(data.toString());
        console.log('-----------');

        broadcast(data, client);
    });

    client.on('end', function () {
        console.log(client.name + ' quit');
        clientList.splice(clientList.indexOf(client), 1);
    });

    client.on('error', function (e) {
        console.log(e);
    });
});

function broadcast(message, sender) {

    var text = sender.name + " says " + message;

    var cleanup = [];

    clientList.forEach(function (client) {

        if (client !== sender) {

            if (client.writable) {                
                client.write(text);
            } else {
                cleanup.push(client);
                client.destroy();
            }
        }
    });

    cleanup.forEach(function (client) {
        clientList.splice(clientList.indexOf(client), 1);
    });
}

chatServer.listen(9000);
const split = require('split');
...
client.pipe(split()).on('data', function (data) {
  // `data` is now a separate line
  console.log('Broadcasting: ');
  console.log(data.toString());
  console.log('-----------');

  broadcast(data, client);
});