lunes, 31 de agosto de 2020

WebSocket Client con C#

 

La tecnología de websocket se ha hecho muy popular y es que realmente nos permite hacer algunas cosas muy fáciles como la posibilidad de habilitar una conexión desde nuestra aplicación web para poder transportar datos.  

En este caso vamos a ver como crear un cliente WebSocket con C#

Vamos a crear una aplicación de console. Mi proyecto tiene el nombre de WebSocketClient. Con el proyecto listo ya podemos iniciar a escribir nuestro código para conexión.

Lo primero que debemos hacer es importar algunas librerías para poder crear la conexión.


using System;
using System.IO;
using System.Net.WebSockets;
using System.Text;
using System.Threading;

Vamos a usar el servicio gratuito de WebSocket que tenemos en esta página http://www.websocket.org/echo.html

Como se puede observar lo primero que vamos a declarar es la variable url que contiene la dirección del WebSocket

   public class Program
    {
        private const string url = "ws://echo.websocket.org";

        public static async System.Threading.Tasks.Task Main(string[] args)
        {
            //Iniciamos un cliente websocket para conectarnos con el servidor
            using (var websocket = new ClientWebSocket())
            {
                //Asignamos el url del servidor de websocket y nos conectamos
                await websocket.ConnectAsync(new Uri(url), CancellationToken.None);

                Console.WriteLine("Message to the server");
                var info = Console.ReadLine();//Mensaje que se quiere enviar al servidor
                //Enviamos el mensaje que capturamos desde la consola
                await websocket.SendAsync(Encoding.UTF8.GetBytes(info), WebSocketMessageType.Text, true, CancellationToken.None);

                //Creamos un arreglo de bytes para recibir la información del servidor
                var buffer = new ArraySegment<byte>(new byte[2048]);
                WebSocketReceiveResult serverResponse;
                using (var ms = new MemoryStream())//Vamos almacenar todos los fragmentos de datos en este objeto en memoria.
                {
                    do
                    {
                        //Vamos a recibir datos pequeños hasta que recibamos todo el mensaje. 
                        serverResponse = await websocket.ReceiveAsync(buffer, CancellationToken.None);
                        ms.Write(buffer.Array, buffer.Offset, serverResponse.Count);
                    } while (!serverResponse.EndOfMessage);

                    if (serverResponse.MessageType == WebSocketMessageType.Close)
                        Environment.Exit(0);//Si el socket se cierra salimos de la aplicación 

                    ms.Seek(0, SeekOrigin.Begin);
                    using (var reader = new StreamReader(ms, Encoding.UTF8))
                        Console.WriteLine(await reader.ReadToEndAsync());
                }

            }
        }
    }

Con un bloque using creamos un objeto de tipo ClientWebSocket que nos permitirá la conexión con el servidor. Para poder iniciar la conexión se tiene que pasar la dirección del servidor al método connectAsync.

La variable info nos permite almacenar cualquier dato que el usuario quiera pasarle al servidor. Luego se pasa al método sendAsync para ser enviado.

En el caso de recibir datos es un poco más complicado. Para esto vamos a recibir tamaños pequeños de información. Almacenándolos en un arreglo de bytes como podemos ver en la variable buffer. Si lo que el servidor nos envía es mayor se va a ir almacenando en la variable ms. En memoria hasta tener toda la información completa. Por eso utilizamos un ciclo.

Cuando tenemos toda la información en la variable ms se debe convertir a un StreamReader que luego la pasaremos en un texto. Esto es lo que al final estamos esperando, como resultado se muestra lo leído en la consola de nuestra app.

Ejemplo


Etiquetas: , , , , ,

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio