<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>WebSocket &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/websocket/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Sun, 02 Aug 2020 22:41:52 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.11</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>WebSocket &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>WebSocket con Java</title>
		<link>https://www.oscarblancarteblog.com/2017/02/23/websocket-con-java/</link>
					<comments>https://www.oscarblancarteblog.com/2017/02/23/websocket-con-java/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 23 Feb 2017 10:00:41 +0000</pubDate>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[WebSocket]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1427</guid>

					<description><![CDATA[<p>En este artículo aprenderemos a implementar WebSocket con Java, ya que en el pasado ya había dado una completa Introducción a los WebSocket y explicamos que estos fueron introducidos como una mejora en HTML5, pero también dijimos que los WebSocket son ejecutados por el navegador, y estos requieren de dos partes, un WebSocket cliente (Navegador) [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/02/23/websocket-con-java/">WebSocket con Java</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignleft wp-image-594 size-thumbnail" src="https://www.oscarblancarteblog.com/wp-content/uploads/2014/07/google-oracle-java1-150x150.jpg" alt="WebSockets con Java" width="150" height="150" />En este artículo aprenderemos a implementar WebSocket con Java, ya que en el pasado ya había dado una completa <a href="https://www.oscarblancarteblog.com/2017/02/20/introduccion-a-lo-websocket/">Introducción a los WebSocket</a> y explicamos que estos fueron introducidos como una mejora en HTML5, pero también dijimos que los WebSocket son ejecutados por el navegador, y estos requieren de dos partes, un WebSocket cliente (Navegador) y un WebSocket Server (Backend). Pues bien, ya habíamos platicado como es que los WebSocket funcionan del lado del navegador, es por eso que ahora hablaremos de la otra cara, los WebSocket Server.</p>
<p>Como el título de este articulo lo dice, hablaremos de cómo implementar los WebSocket utilizado Java como BackEnd, pero cabe mencionar que todos los lenguajes de programación deberían de tener sus propias API’s para soportar conexiones del lado del servidor.  Los WebSocket fueron agregados a apartar de la versión Java EE 7 bajo la especificación JSR 356, es por ello que todos los Application Server certificados para Java EE 7 deberán de tener una implementación estándar de dicha especificación. Basta de charla y pasemos a cómo implementar un WebSocket con Java.</p>
<h2>Implementando un WebSocket con Java</h2>
<p>Para explicar cómo funcionan los WebSocket vamos a implementar un ejemplo muy simple, crearemos una barra de progreso la cual se cargará del valor 0 al 100 simulando que un proceso se está ejecutando en el BackEnd. En el formulario tendremos un botón que iniciara el proceso, cuando el usuario presione el botón, enviaremos un mensaje al BackEnd por medio del WebSocket, en ese momento, el BackEnd iniciara con un proceso de notificaciones el cual enviará por medio del WebSocket un mensaje con las actualizaciones de la barra de progreso. Este ejemplo está desarrollado con Java 8 y Wildfly 9.0.</p>
<p><img loading="lazy" class="aligncenter wp-image-1429" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/WebSocket.gif" alt="WebSocket con Java" width="563" height="226" /><span id="more-1427"></span></p>
<p>Este ejemplo está compuesto de 4 archivos:</p>
<ul>
<li><strong>html:</strong> página principal del proyecto, sobre la que mostraremos la barra de progreso.</li>
<li><strong>js:</strong> Archivo de JavaScript en donde está programado el WebSocket y el procesamiento de los mensajes de envío y recepción.</li>
<li><strong>css:</strong> archivo de clases de estilo (opcional).</li>
<li><strong>java</strong>: Clase donde implementamos el WebSocket Server con Java, esta se ejecuta del lado del servidor.</li>
</ul>
<p><img loading="lazy" class="aligncenter wp-image-1430" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/WebSocket-con-Java.png" alt="WebSocket con Java" width="683" height="303" /></p>
<p>Todo el código del proyecto lo puedes descargar de GitHub: <a href="https://github.com/oscarjb1/ProgressWebSocket.git">https://github.com/oscarjb1/ProgressWebSocket.git</a></p>
<h2>Index.html</h2>
<p>Primero que nada, veremos el documento index.html para entender como esta armada la pantalla:</p>
<pre class="lang:xhtml decode:true" title="index.hml">&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;WebSocket Progress&lt;/title&gt;
        &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
        &lt;script type="text/javascript"src="websocket.js"/&gt;&lt;/script&gt;
        &lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;section  class="container"&gt;
        &lt;h1&gt;WebSocket Progress&lt;/h1&gt;
        &lt;div&gt;
            &lt;div class="progress-container"&gt;
                &lt;form id="form"&gt;
                    &lt;input id="btnSubmit" type="button" value="start" onclick="formSubmit();"/&gt;
                    &lt;progress id="progress" value="0" max="100"&gt;&lt;/progress&gt;
                    &lt;label for="progress" id="lblProgress"&gt;&lt;/label&gt;
                &lt;/form&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/section&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Lo primero que hacemos en el Header es importar al archivo <span class="lang:java decode:true crayon-inline">styles.css</span> del cual no hay mucho que decir, salvo que es utilizado para darle una apariencia más agradable a la página, y el archivo <span class="lang:java decode:true crayon-inline">websocket.js</span> del cual hablaremos más adelante.</p>
<p>El siguiente punto importante es el formulario, en el definimos un botón que al presionarlo ejecutara la función <span class="lang:java decode:true crayon-inline">formSubmit()</span> que está definido en el archivo <span class="lang:java decode:true crayon-inline">websocket.js</span>, que iniciara con el proceso de carga del progress bar.</p>
<p>También tenemos un progress, el cual será actualizado a medida que el WebSocket reciba las notificaciones del BackEnd, para lo cual utilizaremos el ID (progress) para identificarlo más adelante. Finalmente, debajo del progress tenemos un label el cual será actualizado con el progreso del progress bar.</p>
<p>Tanto el progress como el label son actualizados por Javascript a medida que el servidor manda los datos por medio del WebSocket.</p>
<h2>Websocket.js</h2>
<p>Por su nombre, podríamos pensar que se trata de una librería o algún script ya desarrollado, pero la realidad es que es un Script totalmente custom y desarrollado a la medida para esta solución.</p>
<pre class="lang:js decode:true " title="websocket.js">var socket = new WebSocket("ws://localhost:8080/ProgressWebSocket-1.0-SNAPSHOT/progress");
socket.onmessage = onMessage;

function onMessage(event) {
    var btnSubmit = document.getElementById("btnSubmit");
    btnSubmit.disabled = true;
    
    var progress = document.getElementById("progress");
    var data = JSON.parse(event.data);
    progress.value = data.value;
    
    var lblProgress = document.getElementById("lblProgress");
    if(data.value &lt; 100){
        lblProgress.innerHTML = 'Progress: ' + data.value + '%';
    }else{
        btnSubmit.disabled = false;
        lblProgress.innerHTML = "Finish";
    }
    
}

function formSubmit() {
    socket.send("{\"start\":\"true\"}");
}</pre>
<p>La primera línea es la más importante, pues en esta se establece la conexión con el servidor, la clase WebSocket es una clase estándar que nos permitirá comunicarnos con el Servidor de una forma simple, esta clase tiene como parámetro la URL sobre la cual escucha el BackEnd, más adelante veremos cómo está formada esta URL, por lo pronto asumamos que existe un WebSocket Server que está escuchando.</p>
<p>En la línea 2 definimos la función que procesara los mensajes entrantes, es decir, cuando el BackEnd envíe un mensaje al navegador, este lo atenderá por medio del método definido, en este caso, establecemos el método <span class="lang:java decode:true crayon-inline">onMessage</span> para procesar los mensajes entrantes.</p>
<p>En la línea 4 definimos el método <span class="lang:java decode:true crayon-inline">onMessage</span> el cual implementa toda la lógica de procesamiento de los mensajes entrantes, el parámetro <span class="lang:java decode:true crayon-inline">event</span> corresponde al evento recibido y mediante event.data es posible recuperar el mensaje que envió el Servidor. Veamos qué es lo que hace. Primero que nada, en las líneas 5-6 obtenemos la referencia el botón y lo deshabilitamos para impedir que se presione mientras esta en procesamiento. En la línea 8 convertimos el mensaje enviado por el Server en un Json para poderlo procesar. En las líneas 10-11 obtenemos una referencia al progress y actualizamos el valor de la barra de progreso, para lo cual establecemos la propiedad value por el valor enviado por el Servidor. En las líneas 13-19 establecemos el valor del label, indicando el progreso recibido por el servidor, en caso de finalizar (100%), la etiqueta cambia a Finish y el botón se habilitado nuevamente.</p>
<p>Finalmente, en las últimas líneas, tenemos el método <span class="lang:java decode:true crayon-inline">formSubmit</span>, el cual es ejecutado por el botón cuando es presionado, este método manda un mensaje dummy al servidor mediante el método send del WebSocket.</p>
<h2>ServerDashboardWebSocket.java</h2>
<p>Esta es la parte principal para implementar un WebSocket con Java, ya que desde aquí es de donde se aceptan las conexiones del navegador y se procesan los mensajes de envío y recepción.</p>
<pre class="lang:java decode:true" title="ServerDashboardWebSocket.java">package com.osb.progresswebsocket.socket;

import java.util.HashSet;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

/**
 * @author Oscar Blancarte &lt;oscarblancarte3@gmail.com&gt;
 */
@ApplicationScoped
@ServerEndpoint("/progress")
public class ServerDashboardWebSocket {

    private Set&lt;Session&gt; sessions = new HashSet&lt;&gt;();

    @OnOpen
    public void open(Session session) {
        System.out.println("Session opened ==&gt;");
        sessions.add(session);
    }

    @OnMessage
    public void handleMessage(String message, Session session) {
        System.out.println("new message ==&gt; " + message);
        try {
            for (int c = 0; c &lt; 100; c++) {
                for (Session s : sessions) {
                    s.getBasicRemote().sendText("{\"value\" : \"" + (c + 1) + "\"}");
                }
                Thread.sleep(100);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

    @OnClose
    public void close(Session session) {
        System.out.println("Session closed ==&gt;");
        sessions.remove(session);
    }

    @OnError
    public void onError(Throwable e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
}</pre>
<p>Primero que nada, observemos que esta es una clase común y corriente, no extiende ni implementa ninguna clase, sin embargo, esta anotada con <span class="lang:java decode:true crayon-inline">@ApplicationScope</span> y <span class="lang:java decode:true crayon-inline">@ServerEndpoint</span>. Si ya has trabajado con JavaEE es muy probable que conozcas la primera, la cual no pertenece al API de WebSocket, pero es utilizada para crear un Bean disponible durante toda la vida de la aplicación. La segunda, <span class="lang:java decode:true crayon-inline">@ServerEndpoint</span> es en la que debemos de poner atención, con tan solo marcar una clase con ella, le estamos diciendo al Application Server que esta se trata de un WebSocket Server el cual estará escuchando en la URL <strong>http://&lt;HOST&gt;:&lt;PORT&gt;/&lt;APPLICATION&gt;/progress</strong>, la última parte de la url (/progress) es la que definimos en la anotación <span class="lang:java decode:true crayon-inline">@ServerEndpoint</span> por lo que tenemos que tener cuidado de que coincida con la URL que definimos en el archivo <span class="lang:java decode:true crayon-inline">websocket.js</span>.</p>
<p>También podemos ver que tenemos una Set de <span class="lang:java decode:true crayon-inline">Session</span>. Las Session son objetos que representan las conexiones de los navegadores, por lo que tendremos un Set para no perder la referencia a todas las conexiones.</p>
<p>A continuación, veremos una serie de métodos anotados, estas anotaciones le dicen a Application Server que método debe de ejecutar ante cualquier evento. Veamos los diferentes métodos.</p>
<p><strong>Método open</strong>, está marcado con la anotación <span class="lang:java decode:true crayon-inline">@OnOpen</span> y se ejecutara cada vez que una nueva conexión se establezca con el servidor, el parámetro Session representa la conexión y la almacenamos en el Set de sesiones.</p>
<p><strong>Método close</strong>, esta anotado con <span class="lang:java decode:true crayon-inline">@OnClose</span> y se ejecutara cada vez que una sesión se desconecte. Recibe el objeto Session que se desconectó para poder identificarla.</p>
<p><strong>Método onError</strong>, esta anotado con <span class="lang:java decode:true crayon-inline">@OnError</span>, y se ejecutara ante cualquier error, el error es enviado como parámetro.</p>
<p><strong>Método handleMessage</strong>, anotado con <span class="lang:java decode:true crayon-inline">@OnMessage</span>, será ejecutado cada vez que llegue un nuevo mensaje de alguno de los navegadores. Este recibe como parámetro el mensaje enviado y el objeto Session que mando el mensaje. Este es el método más importante en nuestro ejemplo, porque una vez recibido un mensaje, iniciara una serie de envíos de mensajes al navegador. Observemos que haremos un ciclo del 1 al 100 y en cada interación enviaremos al Navegador un mensaje con el progreso, al finalizar cada interación, dormiremos el hilo 100 milisegundos para apreciar mejor como se llena la barra. Utilizamos el método <span class="lang:java decode:true crayon-inline">getBasicRemote()</span> para que nos regrese una implementación de envío asíncrono y seguido ejecutamos el método <span class="lang:java decode:true crayon-inline">sendText</span>, el cual se utiliza para mandar un mensaje de texto al navegador.</p>
<figure id="attachment_3146" aria-describedby="caption-attachment-3146" style="width: 800px" class="wp-caption aligncenter"><a href="https://codmind.com/courses/api-rest-con-spring-boot"><img loading="lazy" class="wp-image-3146 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg.jpg" alt="Curso Mastering API REST con Spring boot" width="800" height="450" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption id="caption-attachment-3146" class="wp-caption-text">Te invito a que veas mi curso Mastering API REST con Spring Boot</figcaption></figure>
<h2>Resumen:</h2>
<p>Repasemos como funciona todo, cuando entramos a la página, esta carga el archivo <span class="lang:java decode:true crayon-inline">websocket.js</span> y establece conexión inmediata con el Servidor, en este momento el método open de la clase <span class="lang:java decode:true crayon-inline">ServerDashboardWebSocket.java</span> es ejecutado para recibir la nueva sesión. Seguido, el usuario presiona el botón start y envía mediante el función <span class="lang:java decode:true crayon-inline">websocket.send</span> un mensaje al Servidor, el Servidor recibe el mensaje mediante el método <span class="lang:java decode:true crayon-inline">handleMessage</span> de la clase <span class="lang:java decode:true crayon-inline">ServerDashboardWebSocket.java</span>, el cual envía una serie de mensaje como respuesta al navegador, por su parte, el navegador procesa los mensajes entrantes mediante la función <span class="lang:java decode:true crayon-inline">onMessage</span> de JavaScript, en esta función se actualiza la barra de progreso.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/02/23/websocket-con-java/">WebSocket con Java</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/02/23/websocket-con-java/feed/</wfw:commentRss>
			<slash:comments>22</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1427</post-id>	</item>
		<item>
		<title>Introducción a los WebSocket</title>
		<link>https://www.oscarblancarteblog.com/2017/02/20/introduccion-a-lo-websocket/</link>
					<comments>https://www.oscarblancarteblog.com/2017/02/20/introduccion-a-lo-websocket/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 20 Feb 2017 09:00:08 +0000</pubDate>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[WebSocket]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1410</guid>

					<description><![CDATA[<p>Los WebSocket fueron introducidos recientemente con la llegada de HTML5 y es sin duda una de las mejoras más esperadas. Los WebSockets nos permite trabajar de forma bidireccional entre el navegador y el servidor, permitiendo enviar y recibir mensajes de forma simultánea (Full Duplex) y manteniendo siempre una conexión activa con el servidor mediante Sockets [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/02/20/introduccion-a-lo-websocket/">Introducción a los WebSocket</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><img loading="lazy" class="size-full wp-image-1506 aligncenter" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/WebSocket.png" alt="Introducción a WebSocket" width="807" height="452" /></p>
<p style="text-align: justify;">
<p style="text-align: justify;">Los WebSocket fueron introducidos recientemente con la llegada de <a href="https://www.oscarblancarteblog.com/2016/11/22/html5-antecedentes-novedades/">HTML5</a> y es sin duda una de las mejoras más esperadas. Los WebSockets nos permite trabajar de forma bidireccional entre el navegador y el servidor, permitiendo enviar y recibir mensajes de forma simultánea (Full Duplex) y manteniendo siempre una conexión activa con el servidor mediante Sockets TCP.<span id="more-1410"></span></p>
<p style="text-align: justify;">A pesar de que la WebSocket fue agregado como una nueva característica de HTML5, la verdad es que es inútil sin una implementación de WebSocket del lado del servidor y es aquí donde entra los lenguajes de programación.</p>
<p>&nbsp;</p>
<h2>Cómo funcionan los WebSockets</h2>
<p style="text-align: justify;">Como ya mencionamos anteriormente, los WebSocket trabajan mediante conexiones TCP con el servidor, por lo que permite mantener una conexión activa y bidireccional entre el Servidor y el Navegador. Para que una conexión WebSocket se dé, debemos de tener dos partes, un WebSocket Server y un WebSocket Cliente, El Server es aquel que acepta las conexiones y que representa el BackEnd y el cliente en este caso sería el navegador. En este contexto, el cliente es el que establece inicialmente la conexión con el servidor. Una vez establecida la conexión, tanto el servidor como el cliente se podrá enviar mensajes simultáneamente. Veamos la siguiente imagen:</p>
<p><img loading="lazy" class="aligncenter wp-image-1412" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/1.png" alt="WebSocket" width="631" height="290" /></p>
<p style="text-align: justify;">En la imagen podemos apreciar que el Navegador (WebSocket Client) establece una conexión con el Server (WebSocket Server), el servidor acepta la conexión y a continuación inicia un intercambio de mensajes entre el Servidor y el Navegador. Cabe mencionar que los WebSocket mantiene su conexión activa durante todo el tiempo que tengamos abierta la pestaña del navegador, pero tanto el cliente como el servidor pueden cerrar la conexión en cualquier momento.</p>
<p>&nbsp;</p>
<h2>Usos de los WebSockets</h2>
<p style="text-align: justify;">Los WebSocket son necesarios cuando debe de existir una comunicación constante entre el Servidor y el Cliente. Anteriormente a los WebSocket, el navegador tenía que consultar constantemente al servidor por nueva información, lo que lo hacía algo tedioso y representaba un problema de performance grave, ya que cuantos más usuarios teníamos conectados a nuestra página, más consultas se realizaban constantemente y en la mayoría de ellas no había datos nuevos que mostrar.</p>
<p><img loading="lazy" class="aligncenter wp-image-1413 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/2.png" alt="WebSocket" width="729" height="334" /></p>
<p style="text-align: justify;">En la imagen podemos apreciar como el navegador realiza varias consultas al navegador para obtener las actualizaciones del servidor, sin embargo, en la mayoría de las consultas no se obtienen nuevas actualizaciones (en verde), si no que hasta pasadas varias actualizaciones se obtiene nuevos datos del servidor (amarillo). Por lo que podemos ver que todas las fechas verdes son consultas innecesarias que van a degradar el performance del servidor y probablemente también el de la base de datos. Lo peor de esto es que, a mayor número de usuarios conectados a la página mayor se acentúa el problema como podemos ver en la siguiente imagen.</p>
<p><img loading="lazy" class="aligncenter wp-image-1414 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/3.png" alt="WebSocket" width="729" height="334" /></p>
<p style="text-align: justify;">En escenarios donde tenemos que obtener datos del servidor de forma constante siempre será mejor utilizar un WebSocket, para que de esta manera sea el mismo Servidor quien nos notifique de inmediato en cuando existan nuevos datos. De esta forma el servidor evita tener que procesar una serie de peticiones innecesarias. Veamos cómo quedaría el escenario anterior con WebSockets:</p>
<p><img loading="lazy" class="aligncenter wp-image-1415 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/4.png" alt="WebSocket" width="732" height="335" /></p>
<p style="text-align: justify;">En esta nueva imagen ya podemos apreciar mucho mejor como es que los WebSocket mantiene la comunicación y de esta forma saber cuándo debemos utilizar los WebSockets. Lo primero que vemos en la imagen es que un navegador le envía información al Servidor, luego, el Servidor notifica los nuevos cambios a otros dos clientes, finalmente existe otros dos navegadores que están conectados, pero no son notificados por que la nueva información no es de su interés.</p>
<p>&nbsp;</p>
<h2>WebSocket y JavaScript</h2>
<p>&nbsp;</p>
<p style="text-align: justify;">Aunque los WebSocket son una de las mejorar agregadas en HTML5, la realidad es que absolutamente todo lo referente a WebSocket del lado del cliente, se tiene que programar con JavaScript, y es desde aquí donde tendremos que establecer la conexión y gestionar el envío y recepción de mensajes.  A continuación, te dejo un guía rápido de cómo utilizar WebSocket con JavaScript:</p>
<p>&nbsp;</p>
<p><strong>Estableciendo conexión con el servidor:</strong></p>
<pre class="lang:js decode:true">var socket = new WebSocket("SERVER_URL");
</pre>
<p style="text-align: justify;">Esta línea nos permite establecer la conexión inicial con el servidor, como parámetro se debe de establecer la URL sobre la cual escucha el Servidor.</p>
<p>&nbsp;</p>
<p><strong>Enviando datos al servidor:</strong></p>
<pre class="lang:js decode:true">socket.send(“This is mi first message with WebSocket”);</pre>
<p style="text-align: justify;">La línea anterior se utiliza para enviar un mensaje al servidor, se puede enviar cualquier tipo de información, lo más normal es el envío de datos en formato Json.</p>
<p>&nbsp;</p>
<p><strong>Recibiendo datos del servidor:</strong></p>
<pre class="lang:js decode:true">socket.onmessage = function (event){
   alert(event.data)
}</pre>
<p style="text-align: justify;">Para recibir mensajes del servidor es necesario definir la función onmessage, la cual será ejecutada cuando se reciba nueva información del Servidor. En el ejemplo imprimo el contenido de event.data, el cual representa el mensaje recibido del Servidor.</p>
<p>&nbsp;</p>
<p><strong>Cerrando la conexión:</strong></p>
<pre class="lang:js decode:true">socket.closed();</pre>
<p>Para cerrar la conexión con el Servidor solo es necesario ejecutar la función closed.</p>
<p>&nbsp;</p>
<p><strong>Eventos</strong></p>
<pre class="lang:js decode:true">socket.onerror = $function</pre>
<p>Función ejecutada tras ocurrir un error.</p>
<pre class="lang:js decode:true">socket.onclosed = $function</pre>
<p>Función ejecutada cuando se cierra la conexión con el servidor.</p>
<pre class="lang:js decode:true">socket.onopen = $function</pre>
<p>Función ejecutada cuando se abre la conexión con el servidor.</p>
<p>&nbsp;</p>
<div class="bs-callout bs-callout-primary">
<h4>Web Socket con Java</h4>
<p>Te recomiendo que le des una revisada a este otro artículo en donde hablo de cómo implementar <a href="https://www.oscarblancarteblog.com/2017/02/23/websocket-con-java/">WebSocket con Java</a></p>
</div>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>&nbsp;</p>
<p style="text-align: justify;">Como podemos apreciar, los WebSocket cambian totalmente el paradigma de la forma en que trabajábamos anteriormente con el servidor y un que pueda parecer un poco complejo, la realidad es que es mucho más fácil de utilizar de lo que parece, además que existe una serie de librerías para cada lenguaje que nos ayudan con el trabajo.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/02/20/introduccion-a-lo-websocket/">Introducción a los WebSocket</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/02/20/introduccion-a-lo-websocket/feed/</wfw:commentRss>
			<slash:comments>24</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1410</post-id>	</item>
	</channel>
</rss>
