0
私はnode.jsで私の最初の措置をしています。私は基本を得るための簡単なチャットルームを実装しようとしていますが、各放送の後に2番目の(空の)メッセージが自動的に送信される理由を理解できません。この現象はほとんどの場合発生しますが、必ずしもそうではありません。私はWindowsでNetbeansを使用しています。クライアント接続をシミュレートするためにPuttyを使用しています。Node.jsブロードキャスト
コンソール出力:
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
コード
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);
おかげで、ロバート:
はしかし、あなたを助けることができるモジュールが別々の(フル)ラインにデータを分割するであろう、例えば
split
のために、そこにあります。あなたの答えはそれを修正しました。それに加えて、私は 'os'モジュールをインクルードし、 '\ n'を 'os.EOL'に置き換えて、クライアント出力のメッセージを適切にフォーマットしなければなりませんでした。 –@ R.Costaああ、 'data'は(デフォルトでは)行末を含んでいません。 – robertklep