简体   繁体   中英

Chat on node.js

Require the modules

var net = require("net");

Store the users and the connections number var count = 0, users = {};

Creates the server

var server = net.createServer(function (conn){

Stores the current nickname and set the utf8 encoding

var nickname;
conn.setEncoding('utf8');

Shows a message on the shell when you stablish a connection

conn.write(' > welcome to \033[92mnode-chat\033[39m!'
    + '\n > ' + count + ' other people are connected at this time.'
    + '\n > please write your name and press enter: ');

The number of connections++

count++;

When recives data it checks if there is a user in the storage with that name shows a message and return. Else shows a welcome message. Otherwise, if you input a message or any data (after have registered your nickname) shows it on the shell.

conn.on('data', function (data){
    data = data.replace('\r\n', '');
    if(!nickname) {
        if(users[data]) {
            conn.write('\033[93m > nickname already in use. Try again:\033[39m ');
            return;
        } else {
            nickname = data;
            users[nickname] = conn;

            for(var i in users) {
                users[i].write('\033[90m > ' + nickname + ' joined the room\033[39m\n');
            }
        }
    } else {
        for(var i in users) {
            if(i != nickname) {
                users[i].write('\033[96m > ' + nickname + ':\033[39m ' + data + '\n');
            }
        }
    }
});

When you close or end the connection deletes your nickname from the storage, number of connections-- and shows a message.

conn.on('close', function(){
    count--;
    delete users[nickname];
    conn.write('\033[90 > ' + nickname + ' left the room\033[39m\n');
});
});

Server on port 3000

server.listen(3000, function (){
    console.log('\033[96m   server listening on *:3000\033[39m');
});

I have a bug in my chat. I stablish two telnet connections using de shell. But when I close one the other one close two, and shows me a error message. What is wrong with my code?

You're trying to write to a closed connection, which will fail since writing to a closed Writable stream throws an error.

conn.on('close', function(){
    count--;
    delete users[nickname];
    conn.write('\033[90 > ' + nickname + ' left the room\033[39m\n');
});

What you want is to broadcast the message to all other users either using Object.keys or a for-in loop.

conn.on('close', function() {
  count --;
  delete users[nickname];
  Object.keys(users).forEach(function (user) {
    users[user].write(nickname + ' left the room');
  });
}

You also don't need a separate count variable to track connected users.

Object.keys(users).length;

But when I close one the other one close two, and shows me a error message

It is because you're not listening for an error event and, by default, an EventEmitter throws an error if an error occurs and no error listener is attached.

conn.on('error', console.log);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM