Skip to content

Instantly share code, notes, and snippets.

@jcarroyo
Created April 6, 2016 02:02
Show Gist options
  • Save jcarroyo/16a0839d62dd6bbe4da114e0ea48ab0c to your computer and use it in GitHub Desktop.
Save jcarroyo/16a0839d62dd6bbe4da114e0ea48ab0c to your computer and use it in GitHub Desktop.
Chat server and client v2
var net = require('net');
var socket = new net.Socket();
var port = 5000;
var host = "127.0.0.1";
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.setPrompt("comando>");
socket.connect(port, host, function(){
rl.prompt();
});
socket.setEncoding("utf8");
socket.on('data', function(data){
console.log("respuesta>", data);
rl.prompt();
});
rl.on('line', function(line){
socket.write(line);
});
var net = require('net');
var port = 5000;
var protocolCommands = ['nick', 'broadcast', 'chat', 'list'];
var util = require('util');
var listClients = [];
var server = net.createServer(function(client){
client.setEncoding("utf8");
processNewClientConnection(client);
client.on('data', function(data){
var parts = data.split(":");
var command = parts[0];
if(protocolCommands.indexOf(command) != -1){
var message = parts[1];
for(var i = 2; i < parts.length; i++){
message += (":" + parts[i]);
}
client.emit(command, message);
return;
}
client.emit('messageError', command);
//handle the error
});
client.on('error', function(err){
console.log("error de comunicación con el cliente", err);
});
client.on('close', function(){
removeClient(client.id);
var message = util.format("internal:El usuario %s se desconectó", client.id);
listClients.forEach(function(sc){
sc.write(message);
});
});
function removeClient(id){
var pos = -1;
for(var i = 0; i < listClients.length; i++){
var sc = listClients[i];
if(sc.id == id){
pos = i;
break;
}
}
if(pos != -1){
console.log("size", listClients.length);
listClients.splice(pos, 1);
console.log("size", listClients.length);
}
}
client.on('list', function(){
var names = [];
listClients.forEach(function(cs){
names.push(cs.id);
});
var message = util.format("list:%s", names.join(','));
client.write(message);
});
client.on('nick', function(nick){
var oldNick = client.id;
client.id = nick;
var message = util.format("changeNick:%s:%s", oldNick, nick);
client.write(message);
});
client.on('messageError', function(command){
var message = util.format("error:El comando %s no es válido", command);
client.write(message);
});
client.on('broadcast', function(broadcastMessage){
var message = util.format("broadcast:%s:%s", client.id, broadcastMessage);
listClients.forEach(function(sc){
sc.write(message);
});
});
client.on('chat', function(chatMessage){
var parts = chatMessage.split(':'),
user = parts[0],
msg = parts[1];
var message = util.format("chatFrom:%s:%s", client.id, msg);
for(var i = 0; i < listClients.length; i++){
if(listClients[i].id == user){
listClients[i].write(message);
break;
}
}
});
});
server.listen(port);
server.on('error', function(err){
console.log("error del servidor", err);
});
function processNewClientConnection(client){
var newID = randomID(8);
client.id = newID;
listClients.push(client);
var message = "internal:Saludos";
client.write(message);
var notification = util.format("internal:Se conecto el usuario %s", newID);
for(var i = 0; i < listClients.length; i++){
if(listClients[i].id != newID){
listClients[i].write(notification);
}
}
}
function randomID(size){
var id = "";
var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
var n = characters.length;
for(var i = 0; i < size; i++){
var r = Math.ceil(Math.random() * 100) % n;
id += characters[r];
}
return id;
}
setInterval(function(){
console.log("total de clientes conectactos", listClients.length);
}, 5000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment