Conceptos Fundamentales de Programación de Redes
Definición de Socket
Un socket es el punto final en un enlace de comunicación de dos vías entre dos programas ejecutándose en la red. Las clases de sockets se utilizan para representar la conexión entre dos programas: el ‘cliente’ y el ‘servidor’.
Ciclo de Vida de un Socket
El ciclo de vida de un socket está determinado por tres fases:
- Creación: Apertura del socket.
- Lectura y Escritura: Recepción y envío de datos por el socket.
- Destrucción: Cierre del socket.
Implementación de Sockets TCP: El Servidor
Pasos para Construir el Servidor
- Crear el socket servidor.
- Aceptar un cliente.
- Obtener los
InputStreamy/oOutputStreamdel cliente (para enviar y leer datos del cliente). - Crear unos
InputStreamy/oOutputStreammás adecuados a nuestras necesidades. - Leer y escribir datos de él y al cliente.
- Cerrar el socket.
1. La Clase ServerSocket
Al instanciar la clase ServerSocket, se utiliza el constructor al que se le pasa un número de servicio (de puerto). Este número de puerto puede ser cualquier entero entre 1 y 65535.
- Los números del 1 al 1023 están reservados para servicios del sistema (como FTP, Mail, WWW, Telnet, etc.).
- Del 1024 en adelante podemos usarlos a nuestro gusto.
Importante: Lo único es que no puede haber dos servidores atendiendo al mismo puerto/servicio.
Ejemplo de Creación de ServerSocket
ServerSocket socket = new ServerSocket (35557);2. Aceptar Conexiones de Clientes
Una vez creado el servidor, le decimos que empiece a atender conexiones de clientes.
Socket cliente = socket.accept();3. Obtención de Streams de Datos
Ahora en cliente tenemos la conexión con el cliente. Lo único que tenemos que hacer es obtener de él el OutputStream o InputStream con los métodos getOutputStream() o getInputStream().
- La clase
OutputStreamnos sirve para enviarle datos al cliente. - La clase
InputStreamnos sirve para leer datos del cliente.
Ejemplos de Obtención de Streams
InputStream entrada = cliente.getInputStream();
OutputStream salida = cliente.getOutputStream();Uso de Data Streams
Tenemos las clases DataInputStream y DataOutputStream. Estas clases tienen un constructor que admite un InputStream y un OutputStream respectivamente.
DataInputStream entradaDatos = new DataInputStream(entrada);
DataOutputStream salidaDatos = new DataOutputStream(salida);Estas clases proporcionan métodos específicos para tipos de datos (ej.: writeInt(), writeFloat(), readInt(), etc.). Para cadenas de texto (strings), usaremos los métodos writeUTF() y readUTF(), que envían/leen las cadenas en formato UTF.
Comunicación sin Conexión: Datagramas UDP
Definición de Datagrama
Un datagrama es un mensaje autocontenido e independiente enviado a través de la red, cuya llegada, momento de llegada y contenido no está garantizado.
- Un datagrama es un mensaje independiente.
- Contiene las direcciones y puertos del origen y destino.
- Comunicación basada en paquetes sobre UDP (User Datagram Protocol).
Partes que Componen un Datagrama
- Mensaje a enviar
- Tamaño
- IP del servidor o localhost
- Puerto
Métodos de Transmisión de Datagramas
Los métodos send() y receive() permiten transmitir datagramas entre un par de sockets.
send(): Es una instancia de unDatagramPacketque contiene un mensaje y su destino.receive(): Se bloquea hasta que se recibe un datagrama, a menos que se establezca un tiempo límite (timeout) sobre el socket.
Control de Tiempo Límite (Timeout)
El método setSoTimeout() permite establecer un tiempo de espera.
Conexión de Datagramas
El método connect() se utiliza para conectar a un puerto remoto particular y una dirección de Internet.
Programación de Datagramas
Servidor UDP
- Crear un socket para el datagrama en un puerto “conocido”.
- Crear un paquete de datagrama vacío.
- Ligar el datagrama al socket y esperar los mensajes del cliente.
- Obtener los datos, dirección y puerto del cliente y mandarle una respuesta.
Cliente UDP
- Crear un socket de datagrama en cualquier puerto disponible.
- Crear un paquete de datagrama con la dirección y puerto destino.
- Mandar el datagrama a través del socket.
- Crear un paquete vacío reservado para la respuesta del servidor.
- Ligar el paquete al socket y esperar por la respuesta del servidor.
- Obtener los datos del paquete de datagrama y procesarlos.
Sockets Multicast
¿Qué es un Socket Multicast?
Son direcciones en el rango 224.0.0.0 a 239.255.255.255. La 224.0.0.0 está reservada y no puede usarse.
Enviando mensajes por estas direcciones, cualquier computadora en la red que las escuche podría leer dicho mensaje, independientemente de cuál sea la IP real de esa computadora.
Concurrencia en Java: Hilos (Threads)
Definición de Hilo
Un hilo es un flujo de ejecución secuencial dentro de un proceso. Los hilos (Threads) proporcionan a un programa una manera de realizar varias tareas de manera concurrente.
Manejo de Hilos en Java
El manejo de hilos se encuentra dentro del paquete java.lang.*.
Clases e Interfaces clave:
Thread: Es responsable de producir hilos funcionales para otras clases.Runnable: Interfaz que define la tarea a ejecutar.ThreadDeathThreadGroupObject
Métodos de Ejecución de Hilos
El método run() es invocado cuando se inicia el hilo (mediante una llamada al método start() de la clase Thread). El hilo se inicia con la llamada al método run() y termina cuando termina este. La interfaz Runnable define este método.
Métodos más utilizados:
start()run()stop()
