Tutorial Crear un chat en Nodejs con Socket.io

Estado
No está abierto para más respuestas.
Mensajes
189
Puntuación de reacción
0
chat-en-nodejs.jpg


Resumidamente que cosas podemos hacer con esta tecnología? , pues podemos crear sistemas de notificaciones como Facebook, o Foro20 (cuando tenemos un nuevo mensaje privado) , podemos realizar Streamings ,es decir, llevar el real time a nuestras webs, las posibilidades son muchas.

Comenzemos:

1° Paso.

Vamos a crear una carpeta llamada “Chat” y dentro de esta vamos a ir metiendo nuestros archivos.
Ahora dentro de la carpeta “Chat”, vamos a crear un nuevo archivo llamado package.json, aquí definimos las dependecias/modulos de nuestra aplicación.
El contenido será el siguiente:

PHP:
{
  "name": "chat-en-nodejs",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "latest",
    "jade": "latest",
    "socket.io":"latest"
  }
}


Una vez hecho esto, vamos a instalarlas con la siguiente instrucción: npm install .

2° Paso

Ahora ya con las dependencias instaladas vamos a crear la estructura básica de nuestra aplicación con la siguiente instrucción: express chatnode. Si se encuentran con un error, prueben ejecutar ” npm install -g express-generator” y vuelvan a intentar.

Una vez creada comenzamos a reemplazar el contenido de los archivos generados automáticamente .Primero el contenido del server, vamos al archivo app.js y reemplazamos su contenido por el siguiente:

PHP:
var port=3000; //Puerto del chat
//Modulos requeridos
var express=require('express'),
   path = require('path'),
   app = express()
  , http = require('http')
  , server = http.createServer(app)
  , io = require('socket.io').listen(server);
    
 
   nickNames=[]; //Lista para guardar la lista de nicks
var counter=0; //Numeros de usuarios en un momento dado en el chat.
app.set('views',__dirname + '/views'); //ruta donde se encuentras las vistas
app.set('view engine','jade'); //Utilizo jade como motor de vista
app.get('/',function(req,res){ // Muestro el index.jade
 res.render('index');
});
 
//Ruta de archivos estaticos
app.use(express.static(path.join(__dirname, 'public')));
 
  //Cuando se conecta un user nuevo automaticamente se ejecuta este evento
  io.sockets.on('connection', function (socket) {
    counter++; //Sumo un al counter de usuarios
    console.log('Usuario Conectado')
 
    //Emito el evento cliente,avisando a todos los usuarios que  se conecto un nuevo user
    io.sockets.emit('cliente', {number:counter})
 
    //Evento que se ejecuta al desconectarse un user
    socket.on('disconnect',function(req,res){
        counter--; //Lo saco del counter de usuarios
        console.log('Usuario Desconectado , en este momento hay online :%d',counter)        
 
        if(!socket.nickName) return; //Verifico que exista el nickname
        if(nickNames.indexOf(socket.nickName)>-1){ //Si el nickname esta dentro de la lista de nicks lo elimino.
             nickNames.splice(nickNames.indexOf(socket.nickName),1);
             console.log(nickNames)
        }
      //Aviso a todos los usuarios la nueva cantidad de usuarios y actualizo la lista de nicks
      socket.broadcast.emit('cliente',{number:counter,listaNicks:nickNames})
 
    })  
 
    //Evento a la espera de que un usuario entre al chat e ingrese su nickname
    socket.on('nickName',function(data,callback){       
 
       //Verifico que el nickname no este en uso
       if (nickNames.indexOf(data)!=-1){
         callback(false)
 
       } else{
          //Si el nick es valido, lo ingreso a la lista de nicks
           nickNames.push(data);
         //Cada user tiene un socket que lo relaciona con el server ,
         //entonces identifico el socket con el nickname  del usuario
           socket.nickName=data;
         //Actualizo la lista de nicknames de todos los usuarios
         io.sockets.emit('listaNicks',{
            listaNicks:nickNames
         });
         callback(true)
        }
    })  
 
     //Evento  a la espera de que un cliente escriba en el chat un mensaje
    socket.on('mensaje',function(data){   
 
      //Envio a todos los clientes, el mensaje escrito en el chat , junto con el nick de quien lo escribio
      io.sockets.emit('nuevoMensaje',{
        nuevoMensaje:data.texto,
        nick:socket.nickName //Observarse que el nick se obtiene desde el socket
      });    
 
    })
});
server.listen(port,function(res,res){
    console.log('Server Corriendo en puerto ' + port);
});


3° Paso

Ahora reemplazaremos el resto del los archivos.
Vamos al archivo view/layout.jade , borramos su contenido y copiamos el siguiente:

PHP:
doctype html
html
    head
        title Chat on Nube 3D
        <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
        <script src="http://localhost:3000/socket.io/socket.io.js"></script>
        <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
        <link rel="stylesheet" type="text/css" href="/stylesheets/style.css">
 
        script(type="text/javascript").
            var socket=io.connect('http://localhost:3000');
            socket.on('cliente',    function    (data){
                $('#count').html("Users Online :" +data.number); //Actualiza el counter de users
 
                //Si un user se desconecta, actualizo la lista de nicks
                if (data.listaNicks !=null) {
                    actualizarNicks(data);
                }
 
            })
            //Event espera a que el server avise que hay un nuevo mensaje
            socket.on('nuevoMensaje',function(data){
                $('#dialogo').append('<p>'+'<strong>'+data.nick+':'+'</strong>'+"                 "+data.nuevoMensaje+'</p>');
            })
            //Actualizo lista de nicks
            socket.on('listaNicks',function(data){
                actualizarNicks(data);
            });
 
            $(function(){
                $('#conversacion').hide();
                $('#conversacion').submit(function(event){
                    var mensaje=$('#message').val();
                    //Envio mensaje al server
                    socket.emit('mensaje',{texto:mensaje});
                    $('#message').val(' ').focus();
                });
 
                $('#set-nickname').submit(function(event){
                    event.preventDefault();
                    var nick=$('#nick').val();
                    //Envio nickname al server
                    socket.emit('nickName',nick,function(data){
                        if (data){
                            $('#set-nickname').hide();
                            $('#conversacion').show();
                        }else{
                            $('#set-nickname').prepend('<p>'+'NickName en uso'+'</p>');
                        }
                    });
                });
            });
 
            function actualizarNicks(data){
                $("#listaDeNicks").empty();
                jQuery.each(data.listaNicks ,function (i,val){
                    $("#listaDeNicks").append($("<li></li>").html(val));
                });
            };
    body
        block content

Lo mismo hacemos con el archivo view/index.jade:

PHP:
extends layout
 
block content
 
  div(id="contenedor", class="container")
    div(class="row")    
 
      div(class="col-lg-6 col-lg-offset-3 text-center")
       h1(class="jumbotron") Chat Nube 3D
 
       form(id='set-nickname',action='#' class="form-inline")
          label(class="control-label") NickName
          input(id="nick" class="form-control " autofocus="autofocus")
          input(type='submit' class="btn btn-primary " value='Guardar' )   
 
       div(id="conversacion")
        div(id="usuarios" class="well")
         p(id="count")
         ul(id="listaDeNicks")
        div(id="dialogo" class="well")
        form(id='form1',action='#' class="form-inline")
          input(id='message'  placeholder="Escribe un mensaje" class="form-control"  )
          input(type='submit' class="btn btn-primary" value="Enviar")

Por último el archivo view/style.css para que se vea más bonito(aclaro que con Css voy mal) :
PHP:
style
.centered{
   float: none;
   margin: 0 auto;
}
 
#dialogo{
    overflow:auto;
    border:1px solid #CCC;
    height: 400px;
    width: 400px;
    text-align: left;
    float: right;
 
}
#usuarios{
    border:1px solid #CCC;
    height: 400px;
    width: 150px;
    float: left;
    text-align: left;
    overflow:auto;
}
 
#message{
    min-width: 350px;
}


Estos son los archivos que necesitamos para crear el chat, están muy bien comentados para que puedan entenderlos.
Ahora podemos ejecutar node app.js dentro de la carpeta chat y verán el chat funcionado :

hacer-un-chat-en-nodejs.jpg

Podes descargar el código fuente desde: https://github.com/iLChopper/chatjs.git .


Si te gusto, solo te pido un "Me agrada" :D
 
Mensajes
6
Puntuación de reacción
0
Buen chat :) sabes sobre alguno que funcione con login de facebook? osea le extraia la foto y nombre de facebook, gracias de antemano
 
Mensajes
189
Puntuación de reacción
0
Mira en la pagina de facebook hay información especifica de como conectar con nodejs https://developers.facebook.com/docs/other-sdks . Realmente no he probado realizarlo, pero no creo que sea complicado .
Si he hecho cosas con Twitter y es muy sencillo realizar la comunicación , en estos días voy a ver si hago un tuto :D
 
Estado
No está abierto para más respuestas.
Arriba