Crear un chat con node.js y socket.io

Para instalar el node.js en estos momentos está en los repositorios de SID de debian:

su
aptitude install nodejs npm
exit
npm install socket.io
nano server.js
var server = require("socket.io").listen(6969);

server.sockets.on("connection", function(message)
{
	message.on("newMessage", function(data)
	{
		server.sockets.emit("sendEvent", data);
	});
});
nano index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Online chat</title>
<style>
body
{
	color: #333;
	background: #333;
	font-family: "Helvetica", Arial;
	font-size: 14px;
	text-align: center;
}
.container
{
	background: #ccc;
	border-radius: 1em;
	box-shadow: 0px 5px 5px rgba(0,0,0,0.5);
	text-shadow: 5px 5px 5px rgba(0,0,0,0.5);
	margin: 1em auto;
	padding: 1em;
	width: 90%;
}

input
{
	display: block;
	font-size: 12px;
	margin: 1em auto;
	padding: 0.5em;
	width: 95%;
}

span
{
	display: block;
	font-size: 12px;
	margin: 1em auto;
	padding: 0.5em;
	width: 95%;
	text-align: left;
}
</style>
<script src="http://clab.nodester.com/socket.io/socket.io.js"></script>
<script type="text/javascript">
<!--
// aquí ponemos la IP PÚBLICA
var websocket = io.connect("http://192.168.100.103:6969");

window.onload = function()
{
	websocket.on("sendEvent", function(data)
	{
		var chat = document.getElementById('zchat');
		var span = document.createElement('span');
		var txt = document.createTextNode(data);
		span.appendChild(txt);
		if(chat.hasChildNodes())
			chat.insertBefore(span, chat.firstChild);
		else
			chat.appendChild(span);
	});

	var form = document.getElementById('zform');
	var message = document.getElementById('zmessage');
	form.onsubmit = function(e)
	{
		websocket.emit("newMessage", message.value);
		message.value = '';
		return false;
	};

	message.value = '';
	message.focus();
};
//-->
</script>
</head>
<body>
<div class="container">
<form id="zform">
	<label>Message: </label>
	<input type="text" name="zmessage" id="zmessage" placeholder="Please insert message" required />
	<input type="submit" />
</form>
</div>
<div id="zchat" class="container">
</div>
</body>
</html>

Arrancamos el servidor:

node server.js

Ahora abrimos el fichero index.html con el navegador para empezar a escribir mensajes.

Gracias a: Curso de Node.js, Websockets y HTML5 de #mejorandola

Post to Twitter

This entry was posted in Gnu / Linux, Internet, Programacion, Webmaster and tagged , , , , , , . Bookmark the permalink.

48 Responses to Crear un chat con node.js y socket.io

  1. matias says:

    de donde puedo descargar este archivo porq ya no existe en ese servidor…

  2. ZiTAL says:

    Lo puedes encontrar en tu sistema así:

    find / | grep socket.io.js

    yo por ejemplo lo tengo en:

    /home/zital/.node_libraries/.npm/socket.io-client/0.8.7/package/dist/socket.io.js
    /home/zital/.node_libraries/.npm/.cache/socket.io-client/0.8.7/package/dist/socket.io.js
    /home/zital/.node_libraries/.npm/.cache/socket.io/0.8.7/package/lib/socket.io.js
    /home/zital/.node_libraries/.npm/socket.io/0.8.7/package/lib/socket.io.js

    copia cualquier fichero ya que todos son lo mismo a la misma carpeta que el index.html y pon así en el html:

    <script src="socket.io.js"></script>

  3. Jorhel says:

    Muy bien por el ejemplo, es aun mas simple que el de mejorando.la, aunque creo que deberias explicar ms a detalle omo funciona para los que no saben de node.

  4. ZiTAL says:

    node.js es el motor de javascript v8 de chrome hecho para que funcione como lenguaje de servidor.
    socket.io es un paquete de node.js para trabajar en tiempo real con los datos del cliente.
    tenéis más información en sus respectivas webs y en wikipedia ;)

    Si vemos el ejemplo, en el servidor.js tenemos 2 eventos:

    “newMessage” que lo que hara es recibir un dato y luego ese dato lo enviamos con el evento “sendEvent” que son los mismos eventos que ponemos en el lado del cliente, tan simple como eso.

  5. Diego says:

    no funciona…

    • ZiTAL says:

      ¿Qué es lo que no te funciona?

      • Ricky says:

        Hola, a mi tampoco me funciona.. fijate que hice todo el codigo, lo unico que cambie fue lo siguiente:
        http://clab.nodester.com/socket.io/socket.io.js
        por
        /socket.io/socket.io.js

        ya que asi está en la documentacion oficial (https://github.com/learnboost/socket.io/)… pero aun asi, cuando ejecuto, el servidor solo me muestra el mensaje: “Welcome to socket.io”

        • ZiTAL says:

          ¿has cambiado la IP en el js? mira con el firebug en el apartado RED/NET si te da algún error por lo que se ve no se te conecta al servidor node.js y un poco de mano izquierda que todo no funciona con copia pega.

          • Ricky says:

            Claro, el tema aqui es que averiguando bien, hay que agregar la siguiente linea de codigo para que el servidor node.js funcione:
            var http = require(“http”);

            y luego hacer las configuraciones respectivas para que el servidor permita la interacción..

  6. sergio says:

    una pregunta se puede realizar un socket en html o forsosamente se rekiere java

  7. erwin says:

    me tira un error al enviar el dato al servidor… por ejemplo si pongo en la url localhost:6969 me dice que esta corriendo el socket.io con el mensaje Welcome to socket.io. modifique todo para que la pagina corriera con mi localhost pero el unico cambio que veo es que en la url me sale el mensaje de la forma http://localhost/chat/?zmessage=asdasd y con el explorador de google me dice Uncaught ReferenceError: io is not defined justo donde supuestamente se comunica o envia el dato al servidor.. si tubiera una pronta respuesta seria genial, me interesa mucho aprender node.js

  8. erwin says:

    XML can’t be the whole program
    ?zmessage=asdasd()?zmessage=asdasd (línea 51)
    [Detener en este error]

    …old;padding:0 0 5px;margin:0;”>Application not found</html

    ?zmessage=asdasd (línea 51, columna 502)

    io is not defined
    ?zmessage=asdasd()?zmessage=asdasd (línea 51)
    [Detener en este error]

    var websocket = io.connect("http://localhost:6969&quot;);

  9. erwin says:

    http://pastebin.com/a0KAhGzd index

    http://pastebin.com/krNNa2tT server

    listo acabo de pegar los códigos de ante mano muchas gracias..

    =)

  10. ZiTAL says:

    No se porque no veo tu comentario en la web:

    // aquí ponemos la IP PÚBLICA
    var websocket = io.connect(“http://localhost:6969″);

    aqui no pongas localhost sino tu IP

    y al parecer la ruta del socket.io.js esta mal, mira en FIREBUG -> NET -> ALL si tienes algun archivo en rojo, puede ser que hayas puesto mal la ruta del javascript

  11. erwin says:

    ahora estoy probando en windows 7…. están seguro que no cambió nada con las nuevas actualizaciones? D:

  12. erwin says:

    Buenas a todos! encontré mi problema al momento de importar la biblioteca de socket.io se debe hacer de la manera:

    yo antiguamente lo hacia sin ponerle el puerto, por eso no me resultaba

    Saludos! y gracias por la guía =)

  13. crist says:

    espectacular el tutorial

  14. Pingback: node.js socket.io: crear session por socket autenticado | Hispabyte

  15. Antonio says:

    Hay forma de dejar el arranque automatico del node server.js

  16. Toni says:

    Hola, estoy buscando un programador que me pueda desarrollar un chat multicanal con node.js. Me podeis ayudar? Gracias

    • ZiTAL says:

      si me dejas tu correo electronico lo pondre en twitter o si tienes twitter dime tu nick, deja el correo electronico como:

      usuario[arroba]dominio[punto]com para prevenir spam

  17. Soldier says:

    Buenas, probe el código pero me aparece solo “Welcome to socket.io.” como algunos otros, ya importe el socket.io.js en la misma ruta que index.html ya que el del servidor ya no existia pero no funciona, alguna solución?

    Saludos

    • ZiTAL says:

      en el index.html

      cambia: var websocket = io.connect(“http://192.168.100.103:6969″);

      por:
      var websocket = io.connect(window.location.protocol+”//”+window.location.hostname+”:6969″);

      de todas formas instala firebug, mira el apartado CONSOLE y NET para ver si existe algún error

      • Soldier says:

        He cambiado la linea pero nada, sigue igual y en Firebug o el inspeccionador de Webkit no hay ningun fallo. Deberías mejor colocar un videotuto anque sea corto para verificar el funcionamiento o una serie de de imágenes.

        Saludos

        • ZiTAL says:

          ¿videotutorial para 2 ficheros? prueba a hacerlo tu para que podamos ver tu fallo, no me creo que no te este dando algun error, ¿la consola de node que dice? ¿que sistema operativo usas?

          • Soldier says:

            Me refería a funcionamiento no a muestreo de código. Uso Linux Mint x64, la consola no da fallo únicamente cuando se inicia el server dice:

            info – socket.io started

            Y eso es todo.

  18. ZiTAL says:

    vamos que el servidor funciona pero desde el cliente no se conecta ya que de lo contrario se activaría el LOG del servidor. Fijate si en el servidor has puesto el mismo puerto. Después del:

    var websocket…
    pon un:
    if(console)
    console.log(websocket);

    si el resultado NO es parecido a este:

    “SocketNamespace { socket=Socket, flags={…}, json=Flag, more…}”

    es que hay algún error en la parte del cliente

  19. It says:

    Muy bien articuló y la duda obvia que surge, como pruebo que funciona si tengo un movil con.navegador y una lap, despues de haber iniciado el server.js, que direccion coloco en el navegador de cada uno?

    De antemano gracias!

    • ZiTAL says:

      tienes que alojar el index.html en un servidor web y poner la IP en el navegador, dentro de poco escribiré una nueva entrada sobre node.js + socket.io a ver si la escribo para esta semana, un saludo

  20. Jarvis says:

    Hola, tengo un par de problemas. Resulta que ejecuto el index.html en firefox y cuando pasa eso o cuando trato de enviar un mensaje me aparece esto en el firebug

    ReferenceError: require is not defined

    var client = require(‘socket.io-client’);

    socket.io.js (line 12)

    ReferenceError: io is not defined

    var websocket = io.connect(window.location.protocol+”//”+localhost+”:6969″);

    ?zmessage=soldier (line 51)

    Estoy en Linux, y así tengo organizados los archivos:
    /var/www/chatnodejs/index.html
    /var/www/chatnodejs/socket.io.js
    /home/miusuario/server.js

    y cuando ejecuto el server js desde la terminal simplemente abro la termina y coloco:
    node server.js

    A que crees que se deba?

    • ZiTAL says:

      puede ser que tengas mal el js del socket.io en la parte del cliente, copia este fichero:

      ./node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js a tu parte pública, puede que hayas copiado el socket.io de la parte del servidor

  21. Soldier says:

    Lo he solucionado, con el comentario anterior ya que habia copiado el socket server y no el cliente y funciono con la línea que esta en el post no con la segunda que me mencionaste:

    var websocket = io.connect(window.location.protocol+”//”+window.location.hostname+”:6969″);

    Si por ejemplo, quiero añadir este pequeño servicio a sitio que ya esta hecho, en que ruta debería copiar el socket.io.js el server.js y el chat.html, es decir, pueden estar los 3 en una misma carpeta?

    Saludos

    • ZiTAL says:

      No es recomendable tener acceso a ficheros de la parte del servidor en una carpeta publica pero el index.html y el socket.io.js los puedes tener

  22. jorge says:

    Es posible que algún usuario abra el cliente de socket io desde otra web y así ver lo que pasa en privado?

    • ZiTAL says:

      Si el programa está bien hecho no, de lo contrario puede, lo suyo es enviar los eventos sólo a los clientes necesarios. En este caso cualquiera podría coger los eventos.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>