Ciclo de vida de un socket y programación de datagramas
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 5,15 KB
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 ‘cliente’ y ‘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 PARA EL SERVIDOR
Pasos para construir el servidor:
- Crear el socket servidor
- Aceptar un cliente
- Obtener los InputStream y/o OutputStream del cliente (PARA ENVIAR Y LEER DATOS DEL CLIENTE)
- Crear unos InputStream y/o OutputStream más adecuados a nuestras necesidades
- Leer y escribir datos de él y al cliente
- Cerrar el socket
La clase ServerSocket
Al instanciarla usaremos 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 de 1 a 1023 están reservados para servicios del sistema (como ftp, mail, www, telnet, etc.). Del 1024 en adelante podemos usarlos a nuestro gusto. Lo único es que no puede haber dos servidores atendiendo al mismo puerto/servicio.
ServerSocket socket = new ServerSocket (35557);
Una vez creado el servidor, le decimos que empiece a atender conexiones de clientes.
Socket cliente = socket.accept();
Ahora en cliente tenemos la conexión con el cliente (valga la redundancia). Lo único que tenemos que hacer es obtener de él el OuputStream o InputStream con los métodos getOutputStream() o getInputStream(). La clase OutpuStream nos sirve para enviarle datos al cliente. La clase InputStream nos sirve para leer datos del cliente.
InputStream entrada = cliente.getInputStream();
OutputStream salida = cliente.getOutputStream();
Tenemos las clases DataInputStream y DataOutputStream. Estas clases tienen un constructor que admite un InputStream y un OutputStream respectivamente. DataInputStream entradaDatos = new DataInputStream (entrada);
DataOuputStream salidaDatos = new DataOutputStream (salida);
Para strings usaremos los métodos writeUTF()
y readUTF()
, que envían/leen las cadenas en formato UTF.
Programación de datagramas
Definición: Un datagrama es un mensaje autocontenido independiente enviado a través de la red, cuya llegada, momento de llegada y contenido no está garantizado.
Partes que componen un datagrama:
- Mensaje a enviar
- Tamaño
- Ip del servidor o localhost
- Puerto
Los métodos send()
y receive()
permiten transmitir datagramas entre un par de sockets. send
es una instancia de un DatagramPacket que 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. El método setSoTimeout()
permite establecer un tiempo de espera. El método connect()
se utiliza para conectar a un puerto remoto particular y una dirección de Internet.
Como programar los datagramas:
Servidor
- Crear un socket para el datagram 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
- 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.
¿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.
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.
El manejo de hilos se encuentran dentro del paquete java.lang.*
Thread *Runnable *ThreadDeath *ThreadGroup *Object -Thread es responsable de producir hilos funcionables para otras clases.
El método run()
. Este método 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 éste. La interface Runnable
Métodos más utilizados:
- start()
- run()
- stop()