Obteniendo tiempo real con Pusher
() translation by (you can also view the original English article)
¿Quieres darle vida a tus aplicaciones web haciéndolas en tiempo real, pero no quieres crear nuevas infraestructuras con el único propósito de hacer que los sockets web funcionen? En este artículo, exploraremos cómo usar e implementar Pusher, un servicio de mensajería en tiempo real basado en HTML5 WebSocket para tus aplicaciones.
Introducción
¿Qué son los WebSockets?
Según la página de Wikipedia de WebSocket, WebSocket es una tecnología que proporciona canales de comunicación bidireccionales, full-duplex, a través de un solo socket TCP.



En términos sencillos, WebSockets permite que un cliente y un servidor se comuniquen en ambas direcciones. Permite que un servidor envíe mensajes al cliente y viceversa.
¿Cómo es esto relevante para mi aplicación web?
A lo largo de los años, la caducidad de los datos siempre ha sido un problema con las aplicaciones web, específicamente aquellas que tienen varias personas conectadas y trabajando en las mismas cosas. Por ejemplo, en una aplicación de gestión de proyectos, los usuarios a veces crean elementos de tareas pendientes que los miembros de su equipo están creando al mismo tiempo. Con WebSockets, esto se puede mitigar permitiendo que el servidor envíe notificaciones a todas las partes conectadas, permitiendo que los navegadores reciban nuevos datos en tiempo real. De hecho, antes de crear un elemento pendiente duplicado, verás que alguien más ya lo ha creado.
¿Qué es Pusher?



Pusher es una API alojada para agregar de manera rápida, fácil y segura funcionalidad escalable en tiempo real a través de WebSockets a aplicaciones web y móviles.
Esencialmente, Pusher encapsula la implementación, la funcionalidad, la depuración y el alojamiento de WebSockets para ti. En lugar de tener que ejecutar tu propio servidor WebSockets, te permite descargar todo el proceso a los servidores de Pusher, lo que te permite ahorrar tiempo y dinero.
Pusher es una API alojada para agregar de manera rápida, fácil y segura funcionalidad escalable en tiempo real a través de WebSockets a aplicaciones web y móviles.
Para que Pusher funcione, necesitarás una biblioteca cliente y una biblioteca de editor. Las bibliotecas de cliente se utilizan con el cliente que interactúa con tu aplicación. Puede ser un navegador (a través de JavaScript), una aplicación de iPhone (a través de Objective-C) o una aplicación Flash (a través de ActionScript). Las bibliotecas de editores se utilizan en tu servidor para enviar eventos a tus clientes.
Actualmente, Pusher tiene bibliotecas cliente para JavaScript, Objective-C, ActionScript, .NET y Silverlight, Ruby y Arduino. Tiene bibliotecas de editor para Node.js, Java, Groovy, Grails, Clojure, Python, VB.NET, C #, PHP, Ruby, Perl y ColdFusion.
Para los propósitos de este tutorial, usaremos la biblioteca cliente de JavaScript y la biblioteca del editor PHP. La implementación no debería ser muy diferente si estás utilizando otro lenguaje de programación.
Tengo ganas de crear un widget de chat en vivo para que la gente pueda chatear en tiempo real en un sitio web. Con esto en mente, continuemos.
Configurando Pusher
Paso 1: Regístrate para obtener una cuenta de desarrollador de Pusher gratuita
Para comenzar, ve al sitio web de Pusher y regístrate para obtener su cuenta. Ofrecen una cuenta gratuita para los usuarios del plan Sandbox, que incluye 20 conexiones y 100.000 mensajes por día. Cuando estés listo, siempre puedes actualizar a un plan pago, pero como solo lo usaremos para nuestra aplicación de muestra, ¡un plan Sandbox gratuito funcionará!



Registro en Pusher
En el sitio, haz clic en el botón Registrarse que encontrarás en la esquina superior derecha e ingresa los detalles requeridos. Una vez hecho esto, haz clic en el botón Registrarse nuevamente para completar tu registro.
Paso 2: inicia sesión por primera vez
Después de registrarte, serás redirigido a tu página de administración de Pusher. Aquí es donde puedes administrar todas tus aplicaciones Pusher. Una sola cuenta puede albergar múltiples aplicaciones.



Página de administración de Pusher
En la parte superior tienes tu barra de navegación, donde encontrarás las siguientes secciones:
- Panel de control - aquí es donde verás las estadísticas de la aplicación Pusher. Puedes ver la Tasa de mensajes (cantidad de mensajes enviados por minuto), Conexiones (cantidad de conexiones abiertas en un momento determinado) y Mensajes (el total de mensajes que tu aplicación envía por día).
- Editar - aquí, puedes cambiar el nombre de la aplicación actual y elegir si usar o no el cifrado SSL.
- Acceso a la API - contiene las credenciales de la API de tu aplicación, que necesitaremos más adelante.
- Depurar - esto mostrará todos los eventos activados y los mensajes enviados por tu aplicación Pusher, así como cuando los clientes se conectan o desconectan. Esto es extremadamente útil al desarrollar tu aplicación web, ya que aquí puedes ver exactamente qué envía y recibe Pusher y quién está en línea para recibirlos.
- Creador de eventos - esta es una herramienta útil para enviar eventos de prueba a tus clientes conectados, sin tener que activar los eventos tú mismo desde tu aplicación web.
¡Ahora estás listo para comenzar a desarrollar con Pusher!
Desarrollando con Pusher
Paso 1: crea el HTML, CSS, JavaScript y PHP
Comencemos a desarrollar nuestro widget de chat en vivo creando el HTML. Lo que tengo en mente es un widget que aparecerá en la parte inferior de la pantalla, con una lista de "Quién está en línea" al costado, como IRC.
1 |
<!DOCTYPE HTML>
|
2 |
<html>
|
3 |
<body>
|
4 |
<div id="chat_widget_container"> |
5 |
<div id="chat_widget_login"> |
6 |
<label for="chat_widget_username">Name:</label> |
7 |
<input type="text" id="chat_widget_username" /> |
8 |
<input type="button" value="Login!" id="chat_widget_login_button" /> |
9 |
<img src="http://nettuts.s3.amazonaws.com/1059_pusher/loading.gif" alt="Logging in..." id="chat_widget_login_loader" /> |
10 |
</div>
|
11 |
|
12 |
<div id="chat_widget_main_container"> |
13 |
<div id="chat_widget_messages_container"> |
14 |
<div id="chat_widget_messages"> |
15 |
chat messages go here |
16 |
</div>
|
17 |
</div>
|
18 |
<div id="chat_widget_online"> |
19 |
<p>Who's Online (<span id="chat_widget_counter">0</span>)</p> |
20 |
<ul id="chat_widget_online_list"> |
21 |
<li>online users go here</li> |
22 |
</ul>
|
23 |
</div>
|
24 |
<div class="clear"></div> |
25 |
<div id="chat_widget_input_container"> |
26 |
<form method="post" id="chat_widget_form"> |
27 |
<input type="text" id="chat_widget_input" /> |
28 |
<input type="submit" value="Chat" id="chat_widget_button" /> |
29 |
<img src="http://nettuts.s3.amazonaws.com/1059_pusher/loading.gif" alt="Sending..." id="chat_widget_loader" /> |
30 |
</form>
|
31 |
</div>
|
32 |
</div>
|
33 |
</div>
|
34 |
</body>
|
35 |
</html>
|
Algunos CSS para diseñar tu HTML:
1 |
#chat_widget_container{padding:20px 20px 5px 20px; background-color:#F2F2F2; border:5px solid #AFAFAF; |
2 |
border-bottom:0px; width:333px; font-size:11px; font-family:"Lucida Grande",Arial,Helvetica,sans-serif; |
3 |
position:fixed; bottom:0px; right:20px} |
4 |
|
5 |
#chat_widget_login{width:333px; text-align:center; height:166px; margin-top:80px} |
6 |
|
7 |
#chat_widget_main_container{display:none} |
8 |
|
9 |
#chat_widget_messages_container{float:left; width:200px; border:1px solid #DDD; height:200px; overflow:auto; |
10 |
padding:5px; background-color:#FFF; position:relative} |
11 |
|
12 |
#chat_widget_messages{overflow-x:hidden; overflow-y:auto; position:absolute; bottom:0px} |
13 |
|
14 |
#chat_widget_online{width:100px; height:210px; float:left; padding:0px 10px; border:1px solid #DDD; |
15 |
border-left:0px; background-color:#FFF; overflow: auto;} |
16 |
|
17 |
#chat_widget_online_list{list-style:none; padding:0px} |
18 |
|
19 |
#chat_widget_online_list >li{margin-left:0px} |
20 |
|
21 |
#chat_widget_input_container{margin-top:10px; text-align:left} |
22 |
|
23 |
#chat_widget_input{width:260px; margin-right:10px; border:1px solid #DDD; padding:2px 5px} |
24 |
|
25 |
#chat_widget_loader{display:none} |
26 |
|
27 |
#chat_widget_login_loader{display:none} |
28 |
|
29 |
.clear{clear:both} |
Los HTML y CSS combinados de arriba deberían representar algo similar a:



Demostración de inicio de sesión
Necesitaremos crear una función que se active cuando hagamos clic en el botón Iniciar sesión y verifiquemos el valor ingresado, así que hagámoslo:
1 |
$('#chat_widget_login_button').click(function() { |
2 |
$(this).hide(); //hide the login button |
3 |
$('#chat_widget_login_loader').show(); //show the loader gif |
4 |
username = $('#chat_widget_username').val(); //get the username |
5 |
username = username.replace(/[^a-z0-9]/gi, ''); //filter it |
6 |
if( username == '' ) { //if blank, then alert the user |
7 |
alert('Please provide a valid username (alphanumeric only)'); |
8 |
} else { //else, login our user via start_session.php |
9 |
ajaxCall('start_session.php', { username : username }, function() { |
10 |
//We're logged in! Now what? |
11 |
}); |
12 |
} |
13 |
}); |
A continuación, debemos informar al servidor cuando hemos iniciado sesión. Para hacer esto, crearemos un archivo start_session.php que básicamente iniciará la sesión del usuario.
1 |
<?php
|
2 |
//Start a PHP session
|
3 |
session_start(); |
4 |
|
5 |
//Get the username sent from the user
|
6 |
$username = $_REQUEST['username']; |
7 |
|
8 |
//filter it
|
9 |
$username = trim(filter_var($username, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES)); |
10 |
|
11 |
//set the username for the session
|
12 |
$_SESSION['username'] = $username; |
13 |
|
14 |
//set a unique id for the user. since we don't have a working user system, we'll just use the time()
|
15 |
//variable to generate a unique id, and add the user's name to it and the user's session id, then
|
16 |
//MD5 the whole thing
|
17 |
$_SESSION['userid'] = md5(time() + '_' + $username + '_' + session_id()); |
18 |
|
19 |
//echo the json_encoded success message for our ajax call
|
20 |
echo json_encode(array('success' => true)); |
21 |
exit(); |
22 |
?>
|
Notarás que he creado una función ajaxCall, que básicamente envuelve la función jQuery $.ajax. Simplemente agrega esto antes de la línea $(document).ready().
1 |
function ajaxCall(ajax_url, ajax_data, successCallback) { |
2 |
$.ajax({ |
3 |
type : "POST", |
4 |
url : ajax_url, |
5 |
dataType : "json", |
6 |
data: ajax_data, |
7 |
time : 10, |
8 |
success : function(msg) { |
9 |
if( msg.success ) { |
10 |
successCallback(msg); |
11 |
} else { |
12 |
alert(msg.errormsg); |
13 |
} |
14 |
}, |
15 |
error: function(msg) { |
16 |
} |
17 |
}); |
18 |
} |
Ahora, carguemos la biblioteca de JavaScript Pusher y también jQuery. Coloca las siguientes referencias de secuencia de comandos dentro del <head> de tu HTML:
1 |
<script src="http://js.pusherapp.com/1.9/pusher.min.js"></script> |
2 |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> |
Paso 2: toma nota de tus credenciales del API
¿Recuerdas la página de acceso a la API de arriba? Vuelve a él y anota tus credenciales de API. Necesitaremos estos valores cuando configuremos las bibliotecas cliente y editor.

Credenciales del API de Pusher
Siéntete libre de usar la mía, sin embargo, te recomiendo que obtengas la tuya propia, ya que una cuenta gratuita es limitada y es posible que te desconecten a mitad de camino.
Paso 3: implementar el código Pusher
Antes de comenzar a implementar Pusher en nuestra aplicación, debemos comprender algunos términos de Pusher:
- Canal - una forma de diferenciar flujos de datos dentro de una aplicación. Una aplicación puede tener varios canales y un canal puede tener varios clientes. Podemos comparar esto con una sala de chat en IRC: todas las personas que están dentro pueden ver todos los mensajes enviados a una sala de chat específica.
- Eventos - esto es similar a que el servidor envía datos al cliente para que puedas ver los mensajes en la sala de chat. Los eventos son activados por la biblioteca del editor y los clientes pueden suscribirse a estos eventos. En nuestra analogía, suscribirse a un evento es similar a escuchar cuando las personas conversan en la sala y tomar nota de lo que están diciendo.
Hay tres tipos de canales:
- Canales públicos - canales a los que cualquiera puede suscribirse, siempre que conozcan el nombre del canal.
- Canales privados - canales a los que solo los usuarios autenticados pueden suscribirse.
- Canales de presencia - similares a los canales privados, pero también nos permiten notificar a otros clientes conectados con información sobre el cliente que se conecta. Usaremos este canal en nuestro widget de chat.
Los canales de presencia son especiales ya que nos permiten enviar información sobre los usuarios cuando se conectan. También tienen eventos especiales a los que podemos suscribirnos para saber cuándo un usuario se conecta y desconecta. Los canales de presencia son ideales para canales privados y seguros que necesitan saber cuándo entra o sale un usuario.
Conectándose al servicio Pusher
Comencemos conectando a nuestro cliente al servicio Pusher. Para hacerlo, necesitaremos crear una nueva instancia del objeto Pusher (de la biblioteca) y llamar a la función subscribe. Agrega el siguiente código después del comentario //We're logged in! Now what?
.
La función Subscribe esencialmente hace que el cliente se una al canal. Una vez dentro del canal, el cliente podrá recibir eventos que sucedan dentro de él.
1 |
pusher = new Pusher('12c4f4771a7f75100398'); //APP KEY |
2 |
Pusher.channel_auth_endpoint = 'pusher_auth.php'; //override the channel_auth_endpoint |
3 |
nettuts_channel = pusher.subscribe('presence-nettuts'); //join the presence-nettuts channel |
¿Qué es un "channel_auth_endpoint"?
Al suscribirse a un canal de presencia o privado, debemos asegurarnos de que el usuario que se conecta tenga permiso para acceder al canal. Por lo tanto, antes de permitir que el cliente se conecte por completo, el cliente Pusher realiza automáticamente una llamada a la URL definida en la variable channel_auth_endpoint y le envía información sobre el usuario que se conecta. Luego, a través de channel_auth_endpoint, podemos averiguar si el usuario que se conecta está autorizado.
De forma predeterminada, esta llamada se realiza a /pusher/auth, pero podemos anularla configurando la variable channel_auth_endpoint.



Pusher genera un
socket_id
único y lo envía al navegador. Cuando se intenta suscribirse a un canal privado o de presencia, elsocket_id
y elchannel_name
se envían a tu aplicación, (1) a través de una solicitud POST AJAX que autoriza al usuario a acceder al canal contra tu sistema de autenticación existente. Si tiene éxito, tu aplicacíon devuelve una cadena de autorización al navegador firmada con tu secreto de Pusher. Esto se envía a Pusher a través de WebSocket, que completa la autorización (2) si la cadena de autorización coincide.
Volviendo a nuestra aplicación, necesitamos crear nuestro channel_auth_endpoint . Crea un archivo, llamado pusher_auth.php y colócalo dentro:
1 |
<?php
|
2 |
//Start the session again so we can access the username and userid
|
3 |
session_start(); |
4 |
|
5 |
//include the pusher publisher library
|
6 |
include_once 'Pusher.php'; |
7 |
|
8 |
//These values are automatically POSTed by the Pusher client library
|
9 |
$socket_id = $_POST['socket_id']; |
10 |
$channel_name = $_POST['channel_name']; |
11 |
|
12 |
//You should put code here that makes sure this person has access to this channel
|
13 |
/*
|
14 |
if( $user->hasAccessTo($channel_name) == false ) {
|
15 |
header('', true, 403);
|
16 |
echo( "Not authorized" );
|
17 |
exit();
|
18 |
}
|
19 |
*/
|
20 |
|
21 |
$pusher = new Pusher( |
22 |
'12c4f4771a7f75100398', //APP KEY |
23 |
'51399f661b4e0ff15af6', //APP SECRET |
24 |
'8896' //APP ID |
25 |
);
|
26 |
|
27 |
//Any data you want to send about the person who is subscribing
|
28 |
$presence_data = array( |
29 |
'username' => $_SESSION['username'] |
30 |
);
|
31 |
|
32 |
echo $pusher->presence_auth( |
33 |
$channel_name, //the name of the channel the user is subscribing to |
34 |
$socket_id, //the socket id received from the Pusher client library |
35 |
$_SESSION['userid'], //a UNIQUE USER ID which identifies the user |
36 |
$presence_data //the data about the person |
37 |
);
|
38 |
exit(); |
39 |
?>
|
Ahora que podemos autenticar a nuestros usuarios que se conectan, necesitaremos vincular algunas funciones de JavaScript a eventos Pusher para mostrar que ya hemos iniciado sesión. Actualiza el código debajo del comentario //We're logged in! Now what?
, así:
1 |
//We're logged in! Now what? |
2 |
pusher = new Pusher('12c4f4771a7f75100398'); //APP KEY |
3 |
Pusher.channel_auth_endpoint = 'pusher_auth.php'; //override the channel_auth_endpoint |
4 |
nettuts_channel = pusher.subscribe('presence-nettuts'); //join the presence-nettuts channel |
5 |
|
6 |
pusher.connection.bind('connected', function() { //bind a function after we've connected to Pusher |
7 |
$('#chat_widget_login_loader').hide(); //hide the loading gif |
8 |
$('#chat_widget_login_button').show(); //show the login button again |
9 |
|
10 |
$('#chat_widget_login').hide(); //hide the login screen |
11 |
$('#chat_widget_main_container').show(); //show the chat screen |
12 |
|
13 |
//here, we bind to the pusher:subscription_succeeded event, which is called whenever you |
14 |
//successfully subscribe to a channel |
15 |
nettuts_channel.bind('pusher:subscription_succeeded', function(members) { |
16 |
//this makes a list of all the online clients and sets the online list html |
17 |
//it also updates the online count |
18 |
var whosonline_html = ''; |
19 |
members.each(function(member) { |
20 |
whosonline_html += '<li class="chat_widget_member" id="chat_widget_member_' + |
21 |
member.id + '">' + member.info.username + '</li>'; |
22 |
}); |
23 |
$('#chat_widget_online_list').html(whosonline_html); |
24 |
updateOnlineCount(); |
25 |
}); |
26 |
|
27 |
//here we bind to the pusher:member_added event, which tells us whenever someone else |
28 |
//successfully subscribes to the channel |
29 |
nettuts_channel.bind('pusher:member_added', function(member) { |
30 |
//this appends the new connected client's name to the online list |
31 |
//and updates the online count as well |
32 |
$('#chat_widget_online_list').append('<li class="chat_widget_member" ' + |
33 |
'id="chat_widget_member_' + member.id + '">' + member.info.username + '</li>'); |
34 |
updateOnlineCount(); |
35 |
}); |
36 |
|
37 |
//here, we bind to pusher:member_removed event, which tells us whenever someone |
38 |
//unsubscribes or disconnects from the channel |
39 |
nettuts_channel.bind('pusher:member_removed', function(member) { |
40 |
//this removes the client from the online list and updates the online count |
41 |
$('#chat_widget_member_' + member.id).remove(); |
42 |
updateOnlineCount(); |
43 |
}); |
44 |
}); |
Recuerda agregar la función updateOnlineCount(); encima de la línea $(document).ready()
:
1 |
function updateOnlineCount() { |
2 |
$('#chat_widget_counter').html($('.chat_widget_member').length); |
3 |
} |
Una explicación de lo que acabamos de agregar.
La función pusher.connection.bind nos permite vincular una función de devolución de llamada cada vez que cambia el estado de la conexión de Pusher. Hay muchos estados posibles, como initialized, connecting, unavailable, failed, and disconnected. No los usaremos en este tutorial, pero puedes leer más sobre ellos en la documentación de Pusher.
La función channel_name.bind nos permite vincular una función a un evento específico que podría suceder dentro del canal. De forma predeterminada, los canales de presencia tienen eventos propios a los que podemos vincular funciones, como el evento pusher:subscription_succeeded que usamos anteriormente. Puedes leer más sobre ellos en la documentación de Eventos de presencia de clientes.
Probemos la aplicación ahora y veamos qué sucede. Para hacerlo, abre dos pestañas de tu aplicación e inicia sesión dos veces. Deberías ver algo como esto:



Primera prueba
Cuando cierras una pestaña, el segundo cliente también se cierra, lo que activa nuestro evento pusher:member_removed y elimina al cliente de la lista en línea:



Segunda prueba
Ahora que está funcionando, finalmente podemos implementar la funcionalidad principal de nuestra aplicación - el chat en vivo.
Implementando la funcionalidad de chat en vivo
Comencemos vinculando una función al evento de envío de nuestro formulario de chat:
1 |
$('#chat_widget_form').submit(function() { |
2 |
var chat_widget_input = $('#chat_widget_input'), |
3 |
chat_widget_button = $('#chat_widget_button'), |
4 |
chat_widget_loader = $('#chat_widget_loader'), |
5 |
|
6 |
message = chat_widget_input.val(); //get the value from the text input |
7 |
|
8 |
chat_widget_button.hide(); //hide the chat button |
9 |
chat_widget_loader.show(); //show the chat loader gif |
10 |
|
11 |
ajaxCall('send_message.php', { message : message }, function(msg) { |
12 |
//make an ajax call to send_message.php |
13 |
chat_widget_input.val(''); //clear the text input |
14 |
chat_widget_loader.hide(); //hide the loader gif |
15 |
chat_widget_button.show(); //show the chat button |
16 |
|
17 |
newMessageCallback(msg.data); //display the message with the newMessageCallback function |
18 |
}); |
19 |
|
20 |
return false; |
21 |
}); |
La función newMessageCallback:
1 |
function newMessageCallback(data) { |
2 |
if( has_chat == false ) { //if the user doesn't have chat messages in the div yet |
3 |
$('#chat_widget_messages').html(''); //remove the contents i.e. 'chat messages go here' |
4 |
has_chat = true; //and set it so it won't go inside this if-statement again |
5 |
} |
6 |
|
7 |
$('#chat_widget_messages').append(data.message + '<br />'); |
8 |
} |
Luego, necesitaremos crear send_message.php para recibir nuestra llamada AJAX desde arriba y activar el evento new_message:
1 |
<?php
|
2 |
//Start the session again so we can access the username
|
3 |
session_start(); |
4 |
|
5 |
//include the pusher publisher library
|
6 |
include_once 'Pusher.php'; |
7 |
|
8 |
$pusher = new Pusher( |
9 |
'12c4f4771a7f75100398', //APP KEY |
10 |
'51399f661b4e0ff15af6', //APP SECRET |
11 |
'8896' //APP ID |
12 |
);
|
13 |
|
14 |
//get the message posted by our ajax call
|
15 |
$message = $_POST['message']; |
16 |
|
17 |
//trim and filter it
|
18 |
$message = trim(filter_var($message, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES)); |
19 |
|
20 |
//wrap it with the user's name when we display
|
21 |
$message = "<strong><{$_SESSION['username']}></strong> {$message}"; |
22 |
|
23 |
//trigger the 'new_message' event in our channel, 'presence-nettuts'
|
24 |
$pusher->trigger( |
25 |
'presence-nettuts', //the channel |
26 |
'new_message', //the event |
27 |
array('message' => $message) //the data to send |
28 |
);
|
29 |
|
30 |
//echo the success array for the ajax call
|
31 |
echo json_encode(array( |
32 |
'message' => $message, |
33 |
'success' => true |
34 |
));
|
35 |
exit(); |
36 |
?>
|
Probablemente te estés preguntando por qué abstraemos newMessageCallback
en su propia función. Bueno, tendremos que volver a llamarlo cuando recibamos un evento new_message de Pusher. El siguiente código vincula una función a un evento, llamado new_message, que se activará cada vez que un usuario envíe un mensaje. Agrega este código después del bloque de código nettuts_channel.bind('pusher:member_removed')
:
1 |
nettuts_channel.bind('new_message', function(data) { |
2 |
newMessageCallback(data); |
3 |
}); |
La variable data
en la función de enlace anterior serán los datos que envía el servidor en la llamada $pusher->trigger()
, que deben contener los datos del mensaje.
Probando
Probemos nuestra aplicación nuevamente con dos navegadores
, no con pestañas. (O pruébalo con un amigo si lo has subido a alguna parte).



¡Hola amigo!
¡Felicidades! Has creado con éxito una aplicación de trabajo utilizando Pusher.
Conclusión
Ahí lo tienes, una aplicación de trabajo en tiempo real impulsada por Pusher. No dudes en visitar la demostración de chat en vivo que configuré aquí.
Hay mucho más de lo que no hablé en este tutorial, como depurar tus aplicaciones, excluir a los destinatarios de los eventos y desencadenar eventos del lado del cliente, pero puedes aprenderlos simplemente leyendo la documentación de Pusher. Incluso puedes ver su exhibición de sitios web y aplicaciones que usan Pusher para trabajar en tiempo real.
Este tutorial solo rasguña la superficie de Pusher y WebSockets en general. Con este tipo de tecnología, lo que puedes hacer solo está limitado por lo que imaginas construir.
¿Has intentado crear algo con Pusher o planeas hacerlo pronto? ¡Házmelo saber en los comentarios!
Nota: Pusher ha solicitado que restablezcamos las Credenciales de API utilizadas por la cuenta de demostración en este tutorial como precaución para que no se abuse de ella. Les pido disculpas a ustedes y espero que puedan obtener la suya propia :) ¡Gracias!