Tal vez has escuchado acerca de los protocolos TCP/HTTP, Hypertext Transfer Protocol (HTTP) y el Transmission Control Protocol (TCP). Ambos son protocolos de solicitud-respuesta, lo que significa que un cliente inicia solicitudes y un servidor escucha las solicitudes y proporciona una respuesta.

Te invito a que te des una vuelta por el curso de Fundamentos de Ingeniería de Software, donde hablan más a detalle acerca de estos protocolos.

TCP es un protocolo de bajo nivel, que se encarga de hacer la conexión que describe los detalles de comunicación entre un servidor y otro. HTTP trabaja dentro de TCP y es el principal encargado de las solicitudes y las respuestas.

Como TCP es el encargado de manejar la conexión entre servidores, es lo primero que debemos comenzar a configurar. Dentro de la librería estándar que se encuentra en Rust, existe std::net, este módulo proporciona funcionalidad de red para los protocolos de control de transmisión y datagramas de usuario, así como los tipos de direcciones IP y de socket. En el módulo contamos con los métodos TcpStream y TcpListener los cuales explicaré en esta clase.

Pero primero, comenzaremos a crear nuestro primer proyecto usando cargo:

cargo new "NombreProyecto"

Y se verá así en su terminal:

Screen Shot 2021-01-05 at 2.52.15 PM.png

Ya que contamos con nuestro proyecto, pueden ver que tenemos nuestros archivos básicos de un proyecto en Rust:

Screen Shot 2021-01-05 at 2.53.00 PM.png

En nuestra primera línea, debemos comenzar llamando al módulo que vamos a usar, en este caso solo necesitaremos de std::net que es a librería estándar de Rust y mandamos llamar a dos métodos que son TcpStream y TcpListener. Entonces nuestra primera línea de código debe verse así:

use std::net::{TcpListener, TcpStream};

Comenzamos haciendo nuestra función principal, uno de los errores más comunes es que comenzamos a declaras variables y a hacer conexiones y no nos damos cuenta que no están dentro de una función, esto puede ocasionar problemas de compilación, recordemos que Rust es un lenguaje multiparadigma entre lenguaje funcional y orientado a objetos, para este caso usaremos la función principal fn main(). Ahora, dentro de la función escribimos la siguiente línea de código:

let listener = TcpListener::bind("127.0.0.1:7373").unwrap();

En este caso, estamos dando valor a una variable donde por medio de la struct de TcpListener (una estructura que representa un socket server) le decimos que escuche desde Tcp conexión 127.0.0.1:7373, para esto la función bind nos ayuda a decirle que esta es una nueva instancia. A diferencia de otros lenguajes, no podemos usar un puerto como 80, ya que requerimos credenciales de administrador, es por eso que nuestros puerto deben ser mayor a 1024, como este curso es para fines de aprendizaje y es un servidor de una sola tarea, lo dejaremos así por el momento. Al final tenemos unwrap con el cual lo único que nos indica es que termine la conexión si llegara haber errores.

Ahora trabajarás con TcpStream que es una estructura que representa una secuencia Tcp entre un socket local y un socket remoto, en pocas palabras vé si hay una conexión entre cliente y servidor.

for stream in listener.incoming() { match stream { Ok(stream) => { println!("¡Nuevo cliente!"); } Err(e) => { println!("Conexión fallida") } } }

Analicemos el código de arriba, stream es una versión asíncrona de un iterador, un stream representa una conexión abierta entre cliente y servidor. Después tenemos ìncoming que es un iterador de TcpListener nos devuelve un mismo iterador que nos da una secuencia de secuencias.

Corramos nuestro código, para esto podemos usar:

cargo run

Esperamos en lo que termina, escribe la dirección que asignaste para la conexión dentro de TcpListener en mi caso es "127.0.0.1:7373", dentro de tu navegador. Por el momento nos mostrará un mensaje de conexión fallida, ya que no tenemos información para mostrar. Pero no te preocupes, en tu terminal podrás ver el mensaje "¡Nuevo cliente!" cada que intentas acceder.

Si ves que te envía varios mensajes simultáneos, no te preocupes pues es normal que a veces haga solicitudes a diferentes recursos dentro de la página, y esa sea la razón por la cual muestre los mensajes.

Ya que tienes un servidor sencillo activo, cuéntame en los comentarios, cómo te funciono todo, qué mensaje envías para saber que ya tienes una conexión cliente-servidor.