PROYECTO 2.
1 SEGUNDO BIMESTRE
MECANISMO DE COMUNICACIÓN
SOCKETS
PATRICIO VLADIMIR SÁNCHEZ ESPINOZA
FERNANDO SEBASTIÁN GUARDERAS GONZÁLEZ
KENNETH ANDRES PANTOJA MANOBANDA
DOCENTE: ING. XAVIER CALDERÓN
FEBRERO 2023
ESCUELA POLITÉCNICA NACIONAL
FACULTAD DE INGENIERÍA ELÉCTRICA Y ELECTRÓNICA
SISTEMAS OPERATIVOS
0
Introducción
Un computador, terminal y/u otro dispositivo de procesamiento realizan un intercambio
de datos, este proceso puede resultar algo complicado, y para esto debe existir una ruta
entre los computadores, ya sea por medio de enlace directo o una red de comunicaciones.
Para la comunicación es necesario resaltar al sistema emisor el cual activa el enlace
directo de comunicación de datos e informa a la red de comunicaciones de la identidad
del sistema destinatario deseado. Luego existe un sistema emisor que verifica que el
sistema de destino esté preparado para recibir datos.
La aplicación de transferencia de ficheros del sistema origen debe verificar que el
programa gestión de ficheros del sistema destino está preparado para aceptar y almacenar
el fichero de ese usuario particular.
El intercambio de información entre computadores con finalidad cooperativa se conoce
como comunicación de computadores. Cuando uno o más computadores se interconectan
a través de una red de comunicación, el conjunto de computadores se denomina red de
computadores.
Toda esta información redactada hasta el momento brinda como introducción al concepto
de socket¸ el cual es un concepto para la comunicación entre un proceso cliente y un
proceso servidor.
Concepto de Socket y Funcionamiento
En esencia, un socket permite la comunicación entre un proceso cliente y un proceso
servidor, se detalla que un socket cliente utiliza una dirección para llamar a un socket de
servidor en otro equipo. Una vez que los sockets han entrado en comunicación tienen la
posibilidad de ambos dispositivos intercambiar datos.
Para el funcionamiento de esta comunicación, un servidor mantiene abierto un puerto
TCP o UDP, preparado para llamadas entrantes no planificadas. Por otra parte, el cliente
determina la identificación del socket del servidor deseado buscando en una base de datos
de Sistema de nombres de Dominio (Domain Name System, DNS). Luego de realizarse la
conexión, el servidor redirige el diálogo a un puerto diferente para liberar el número de
puerto principal para nuevas llamadas entrantes.
Implementación de socket
Un socket se utiliza para definir una interfaz de programación de aplicaciones (API), y
esta es una interfaz genérica de comunicaciones para escribir programas que usan TCP y
UDP. Ahora ya en la parte práctica, cuando se usa como una API, un socket se identifica
por tres parámetros (protocolo, dirección local, proceso local). La dirección local es una
dirección IP y el proceso local es un número de puerto. Ya que los números de los puertos
son únicos en un sistema, el número del puerto implica el protocolo (TCP o UDP). Sin
embargo, por claridad y facilidad de implementación, los sockets utilizados en el API
incluyen un protocolo, así como la dirección IP y el número de puerto para definir un
socket.
Proceso de funcionamiento del socket
El primer paso es la configuración del socket y esto es importante en la utilización de
este, lo cual se busca crear el nuevo socket para realizar la comunicación. Este mandato
incluye tres parámetros; la familia del protocolo, para usar los protocolos TCP/IP. Tipo,
que especifica si es un socket stream o datagrama, y protocolo, que especifica TCP o
UDP.
El segundo paso se debe establecer una conexión con el socket remoto. Una parte
funciona como un cliente, y solicita una conexión a la otra parte, que actúa como servidor.
La configuración de la parte servidora de una conexión requiere dos pasos. Primero, la
aplicación servidora realiza un listen (), para indicar que un determinado socket está listo
para aceptar conexiones entrantes. Se establece un parámetro de número de conexiones
permitidas en la cola de entrada. Estas conexiones se sitúan en una cola hasta que el
servidor realiza una aceptación y se extrae la solicitud de la cola.
Por último, se establece la comunicación del socket y es aquí donde se puede enviar y
recibir datos usando esta conexión que además tiene su identificador. Cuando se realiza
la llamada se apunta al bloque de datos a ser enviado y un parámetro que especifica un
número de bytes a enviar. Dentro de este proceso existen parámetros de control para llevar
la correcta implementación de la comunicación y para finalizar se cuenta con un buffer
para almacenar los datos entrantes.
Explicación del código implementado para un cliente genérico
//se importan las clases necesarias para el script
import java.io.*;//clase que nos permite usar y guardar los
directorios
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;// permite usar loggs
//inicio de la clase
public class Cliente {
// inicio del script
public static void main(String[] args) {
final String host = "127.0.0.1"; //dirección ip local
final int puerto = 5000; //Mismo puerto que servidor
DataInputStream in;//entrada de dato primitivo portable
DataOutputStream out;// salida de dato primitivo portable
//capturamos el posible error al usar un socket
try {
Socket sc = new Socket(host, puerto);//se crea un objeto
socket usando
//usando el host y el puerto creados anteriormente
in = new DataInputStream(sc.getInputStream());// se
insertan los valores con las direcciones
//de direcciones a usar en la entrada
out = new DataOutputStream(sc.getOutputStream());
// se inserta las direcciones de salida del socket
out.writeUTF("Hola desde el cliente"); //Enviamos un
mensaje al servidor
String mensaje = in.readUTF();//Lee el mensaje del
servidor
System.out.println(mensaje);//imprime por pantalla el
mensaje preconfigurado del servidor
sc.close(); //se cierra el socket para evitar problemas de
ejecución
//el try catch captura el objeto IoException que evita
problemas de entrada/salida
} catch (IOException ex) {
Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
//obtiene el nombre del cliente en caso de darse el error
de entrada/salida
}
}
}
Explicación del código implementado para el servidor
//importacion de las librerias necesarias
import java.io.DataOutputStream;//uso de dato primitivo tipo
directorio de salida
import java.io.*;//implemneta toda la libreria tipo io
import java.net.ServerSocket;//permite usar elementos tipo socket
import java.net.Socket;
import java.util.logging.Level;//importa elementos de la libreria
level
import java.util.logging.Logger;//permite usar objetos tipo logging
// inicio de la clase
public class Servidor {
public static void main(String[] args) {
ServerSocket servidor; //Servidor
Socket sc; //Socket del cliente
final int puerto = 5000; //Puerto a utilizar
try {
servidor = new ServerSocket(puerto);//se crea el socket
del servidor
//con el puerto creado anteriormente
System.out.println("Servidor iniciado");//mensaje del
sistema que indica
//que inicio
DataInputStream in; //Recibe los directorio
DataOutputStream out; //Enviar información
//ejecutamos el script servidor indefinidamente
while(true){
sc = servidor.accept(); //Espera a que se mande una
petición de un programa externo y se establece la conexión con el otro
programa
System.out.println("Cliente conectado");//mensaje de
confirmacion
//de la coneccion realiada
in = new DataInputStream(sc.getInputStream());
//Canal de entrada
out = new DataOutputStream(sc.getOutputStream());
//Canal de salida
//inicia el proceso de entrada/salida de informacion
String mensaje = in.readUTF(); // Espera a que el
cliente envíe un mensaje
System.out.println(mensaje); // imprime el mensaje
del cliente
out.writeUTF("Hola desde el servidor");
sc.close();//cierro el cliente
System.out.println("Cliente desconectado");// Mensaje
cliente desconectado
}
// se captura el posible error de entrada/salida de datos
en caso que exista
} catch (IOException ex) {
Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null,
ex);
// guarda el dato de tipo logging
}
}
Salida del script
Tabla de instrucciones del programa implementado
Clase Descripción Métodos Descripción
Envía una petición al
servidor, recibe la
afirmación del servidor,
envía mensajes y finaliza
Cliente la conexión.
Espera a una a una
petición, cuando ocurre
la petición por parte del
Servidor cliente, la acepta,
de forma que
intercambian
información.
Espera por las peticiones Espera por una
que llegan a la red. conexión a ser
ServerSocket Permite manipular la accept() realizada por el
conexión desde el lado socket(cliente) y
del servidor. la acepta.
Permite implementar la
Socket conexión desde el lado close() Cierra el socket.
del cliente.
Retorna el flujo
getOutputStream() de salida para ese
socket.
Retorna el flujo
getInputStream() de entrada para
ese socket.
Permite leer los datos de Lee una cadena
DataInputStream readUTF()
un flujo de entrada. en formato UTF.
Escribe una
Permite escribir datos a
DataOutputStream writeUTF() cadena usando el
un flujo de salida.
formato UTF.
Conclusiones
• Un socket es un sistema de comunicación de procesos que ocurren en diferentes
computadores que se encuentran en una misma red, en el cual se permite el envío
y recepción de datos.
• Un socket puede ser implementado en distintos lenguajes de programación. Tanto
el cliente como el servidor pueden estar codificados en distintos lenguajes y aun
así conectarse para el envío y recepción de información.
• Clientes ya existentes pueden conectarse sin ningún problema con un socket
codificado por nosotros, lo importante es conocer el puerto especifico y las
direcciones IP o el dominio del servidor.
• Los sockets son útiles al momento de crear e implementar sistemas en la web que
sean fuertes y extensibles para obtener los resultados esperados por el cliente.
• El uso de sockets en la creación de servicios web como mensajería instantánea es
imprescindible ya que el retraso que tienen al enviar y recibir información es
mínimo siendo estos más rápido que los sistemas que almacenan datos en bases
de datos.
• Los sockets facilitan la implementación de sistemas de comunicaciones con
probabilidades de error o falla muy bajas.
Recomendaciones
• Para una nueva versión de código, se podría implementar funciones como el envío
de otro tipo de información como archivos, ficheros, etc.
• Implementar el cliente en otro lenguaje de programación y probar el
funcionamiento de este junto al servidor codificado en java. Realizar el proceso
inverso a lo mencionado.
• Implementar el servidor en java u otro lenguaje de programación y comprobar que
puede conectarse y recibir información de clientes ya existentes conectados en un
puerto especifico.
Bibliografía
[1] W. Stallings, Sistemas Operativos, Aspectos internos y principios de diseño, 5th ed.
Madrid: Pearson Education, 2005, p. Capítulo 13 - Redes.