Revista Informática

Sinatra desde Cero: Streaming y Attachments

Publicado el 20 febrero 2014 por Codehero @codeheroblog

Para comprender correctamente todo lo que hablaremos en esta serie, es conveniente tener un conocimiento básico sobre el lenguaje de Ruby. Podrás conseguir toda la información desees aquí

La información para este artículo la sacamos de la recopilación de información del libro Sinatra: Up and Running y de la Documentación oficial


¿Qué es Streaming?

El streaming (también denominado lectura en continuo, difusión en flujo, lectura en tránsito, difusión en continuo, descarga continua o mediaflujo) es la distribución de multimedia a través de una red de computadoras de manera que el usuario consume el producto al mismo tiempo que se descarga. La palabra streaming se refiere a: una corriente continua (sin interrupción). Este tipo de tecnología funciona mediante un búfer de datos que va almacenando lo que se va descargando en la estación del usuario para luego mostrarle el material descargado. Esto se contrapone al mecanismo de descarga de archivos, que requiere que el usuario descargue por completo los archivos para poder acceder a su contenido.

El término se aplica habitualmente a la difusión de audio o vídeo. El streaming requiere una conexión por lo menos de igual ancho de banda que la tasa de transmisión del servicio. El streaming de vídeo se popularizó a fines de la década de 2000, cuando el ancho de banda se hizo lo suficientemente barato para gran parte de la población.

Este párrafo es fuente de wikipedia

¿Cómo funciona en Sinatra?

En Sinatra tenemos dos maneras posibles de hacer streaming, una es dejar la conexión abierta por el tiempo que sea necesario en el cual uno o varios usuarios esten conectados y la segunda es por un tiempo finito mientras dure una “conexión o función”.

Basandonos en los ejemplos de la documentación oficial podemos ver como funcionan ambos método de streaming.

Dejando una conexión abierta

Para realizar nuestro pequeño demo tipo “chat” debemos instalar la siguiente gema manualmente gem install thin.

Una vez que tengamos instalada la gema debemos crear un archivo llamado cap12.rb y utilizamos el siguiente código:

 

require 'sinatra' set server: 'thin', connections: [] before do content_type :txt end get '/chat' do stream(:keep_open) do |out| settings.connections << out out.callback { settings.connections.delete(out) } end end get '/enviar/:mensaje' do settings.connections.each do |out| out << "#{Time.now} -> #{params[:mensaje]}" << "\n" end "Enviado #{params[:mensaje]} el mensaje." end

123456789101112131415161718192021 require'sinatra'set server:'thin',connections:[] before do  content_type:txtend get'/chat'do  stream(:keep_open)do|out|  settingsconnections&lt;&lt;out  outcallback{settingsconnectionsdelete(out)}  endend get'/enviar/:mensaje'do  settingsconnectionseachdo|out|  out&lt;&lt;"#{Time.now} -> #{params[:mensaje]}"&lt;&lt;"\n"  end   "Enviado #{params[:mensaje]} el mensaje."end

 

Vamos a explicar un poco cómo funciona, lo primero es agregar Sinatra y luego establecer que el servidor de nuestra aplicación sea thin y crear un arreglo de conexiones vacías.

Luego debemos crear dos rutas para nuestra aplicación, la primera se llama /chat y funciona como elemento central a donde llegan todos los mensajes. La segunda ruta es referente a la ruta encargada de enviar los mensajes /enviar/:mensaje.

Dentro de la ruta /chat encontramos un método que se llama stream y que tiene como parámetro :keep_open que se encarga de mantener la conexión abierta en todo momento hasta que el usuario se salga de dicha ruta. Dentro del stream vemos que hay una conexión que recibe las salidas o impresiones que realizamos y a su vez tenemos el método que cierra la conexión hacia el usuario cuando el mismo se sale de la ventana.

Por otra parte en la ruta /enviar/:mensaje vemos que hay el método que guarda relación con las conexiones y se le asigna a out los mensajes que vamos enviando y este los pasa hacia el “chat”.

Para probar la aplicación podemos realizar lo siguiente:

 

$ ruby cap12.rb

1 $ruby cap12rb

 

Luego abrimos 2 terminales, en 1 vamos a escribir lo siguiente:

 

$ curl http://localhost:4567/chat

1 $curl http://localhost:4567/chat

 

y en el otro vamos a mandar los mensajes:

 

$ curl http://localhost:4567/enviar/hola

1 $curl http://localhost:4567/enviar/hola

 

Luego revisamos el terminal del /chat y veremos que está el mensaje que agregamos mediante la ruta. Si desean escribir más pueden hacerlo.

Streaming finito

A diferencia de la conexión abierta este se encarga de enviar los datos necesarios y luego finalizar la conexión. Dentro del mismo archivo cap12.rb u otro si desean debemos agregar el siguiente código:

 

require 'sinatra' set server: 'thin' before do content_type :txt end get '/' do stream do |out| out << "Hola!\n" sleep 2 out << "¿Cómo estas? \n" sleep 2 out << "¿Todo bien? \n" end end

12345678910111213141516 require'sinatra'set server:'thin' before do  content_type:txtend get'/'do  stream do|out|  out&lt;&lt;"Hola!\n"  sleep2  out&lt;&lt;"¿Cómo estas? \n"  sleep2  out&lt;&lt;"¿Todo bien? \n"  endend

 

Aquí estamos de igual manera utilizando el método stream para escribir en el bloque con variable out todos los mensajes que necesitamos enviar, cuando se terminen cerramos el stream.

De estas dos maneras que se enseñaron de manera muy sencilla se puede establecer una conexión que envíe información desde el servidor y el usuario o cliente se quede esperando los mensajes. Si desean ampliar un poco y ver un chat un poco más completo pero muy sencillo que tiene interfaz pueden ver el código aquí.


Archivos adjuntos

Un archivo adjunto, archivo anexo, adjunto de correo o, en inglés, attachment es un archivo que se envía junto a un mensaje de correo electrónico. Pueden ser enviados no codificados o codificados de diferentes maneras: base64, binhex, UUEncode, quoted-printable. En MIME, el formato de correo electrónico estándar, los mensajes y sus adjuntos son mandados con el tipo multipart message, habitualmente usando base64 para adjuntos que no son texto.

Este párrafo es fuente de wikipedia

¿Cómo funciona en Sinatra?

Enviar archivos adjuntos en Sinatra es relativamente sencillo esto porque existe un método dentro del DSL que se encarga prácticamente de todo. Al usar el método le decimos a la aplicación que debe subir el archivo al servidor en vez de regresar una respuesta normal.

Para subir un archivo adjunto de una manera sencilla podemos realizarlo de la siguiente manera:

Podemos seguir utilizando el archivo cap12.rb o crear uno nuevo:

 

require 'sinatra' set server: 'thin' before do content_type :txt end get '/adjunto' do attachment 'archivo.txt' "Almacena el archivo!" end

1234567891011 require'sinatra'set server:'thin' before do  content_type:txtend get'/adjunto'do  attachment'archivo.txt'  "Almacena el archivo!"end

 

Aquí observamos que existe una nueva ruta /adjunto que contiene un método llamado attachment; este método puede recibir un archivo o no, pero aquí lo estamos utilizando con un archivo llamado archivo.txt.

Si ahora hacemos la petición via cURL vamos a observar que el encabezado del la petición tiene una variable que se llama Content-Disposition que indica a que la petición tiene un archivo adjunto y cual es el nombre del archivo, hagamos la prueba:

 

$ curl -v http://localhost:4567/adjunto < HTTP/1.1 200 OK < Content-Type: text/plain;charset=utf-8 < Content-Disposition: attachment; filename="archivo.txt" < Content-Length: 20 < X-Content-Type-Options: nosniff < Connection: keep-alive * Server thin 1.6.1 codename Death Proof is not blacklisted < Server: thin 1.6.1 codename Death Proof < * Connection #0 to host localhost left intact Almacena el archivo!%

12345678910111213 $curl-vhttp://localhost:4567/adjunto &lt;HTTP/1.1200OK&lt;Content-Type:text/plain;charset=utf-8&lt;Content-Disposition:attachment;filename="archivo.txt"&lt;Content-Length:20&lt;X-Content-Type-Options:nosniff&lt;Connection:keep-alive*Server thin1.6.1codename Death Proof isnotblacklisted&lt;Server:thin1.6.1codename Death Proof&lt;*Connection#0 to host localhost left intactAlmacena el archivo!%

 

Como lo expliqué anteriormente apreciamos la variable que a su vez contiene el nombre del archivo llamado archivo.txt.


Conclusión

En este doceavo capítulo de la serie, hemos visto como realizar streaming en el servidor para hacer una especie de chat muy sencillo desde la línea de comandos, además vimos como se adjuntan archivos utilizando las funciones que proporciona Sinatra para esto. Si te surge algún tipo de duda no te detengas y déjanos un comentario, que gustosamente lo responderemos.

¡Hasta el próximo capítulo!


Volver a la Portada de Logo Paperblog