03.3. - Guia N°03-Kike-PC

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 8

Taller de Procesamiento Distribuido.

1
Guía 2
Facultad: FIISI
Escuela: Informática
Curso: Taller de
Procesamiento Distribuido

Tema: Socket

Contenido

En esta guía se aborda la aplicación de los Socket como


middleware para la comunicación entre procesos de diferentes
máquinas.

Objetivos Específicos

 Conocer las características básicas de un Socket.


 Crear un Software.

Material y Equipo

 Guía No 2.
 Computadora con Netbeans.
 Compañero que cuente con un Smartphone y Computadora
con Netbeans.

Introducción Teórica

En la guía anterior se había explicado la importancia que


tiene los Middleware para la creación de Sistemas
Distribuidos, en esta guía se explicará la definición y
creación de un middleware con Socket.

Socket

Los sockets son un sistema de comunicación entre procesos de


diferentes máquinas de una red. Más exactamente, un socket es
un punto de comunicación por el cual un proceso puede emitir
o recibir información.

JAVA Socket

El paquete java.net de la plataforma Java proporciona una


clase Socket, la cual implementa una de las partes de la
2 Taller de Procesamiento Distribuido. Guía 2
comunicación bidireccional entre un programa Java y otro
programa en la red.

La clase Socket se sitúa en la parte más alta de una


implementación dependiente de la plataforma, ocultando los
detalles de cualquier sistema particular al programa Java.
Usando la clase java.net.Socket en lugar de utilizar código
nativo de la plataforma, los programas Java pueden
comunicarse a través de la red de una forma totalmente
independiente de la plataforma.

De forma adicional, java.net incluye la clase ServerSocket,


la cual implementa un socket el cual los servidores pueden
utilizar para escuchar y aceptar peticiones de conexión de
clientes.

Funcionamiento de JAVA Socket

Un Socket es una conexión entre dos hosts. Bajo esta


conexión, se pueden ejecutar las siguientes operaciones
básicas:

 Conectarse a una máquina remota;


 Enviar datos;
 Recibir datos;
 Cerrar una conexión;
 Escuchar datos entrantes;
 Aceptar conexiones de máquinas remotas.

La clase Socket

La clase java Socket, la cual es usada tanto por aplicaciones


cliente como aplicaciones servidor, tiene métodos que
Taller de Procesamiento Distribuido. 3
permiten implementar los Guía 2
cuatros primeras operaciones; las
restantes, son exclusivas de aplicaciones servidor. Las
aplicaciones servidor siempre esperan por aplicaciones
cliente que se conecten a ellas y son implementadas por la
clase ServerSocket.

Los programas java utilizan normalmente sockets cliente de la


siguiente manera:

a. El programa crea un nuevo socket utilizando el


constructor Socket ().
b. El socket intenta conectarse a un host remoto.
c. Una vez establecida la conexión, las máquinas local y
remota obtienen flujos de entrada y salida desde el
socket y usan estos flujos para intercambiar
información.
d. Cuando la transmisión de datos ha sido completada, una
de las dos partes, o ambas, cierran la conexión.

La clase ServerSocket

La clase ServerSocket contiene todo lo necesario para poder


escribir un servidor en Java. Por ejemplo:

 Tiene constructores que crean objetos ServerSocket


 Métodos que escuchan por conexiones en un puerto
específico.
 Métodos que retornan un objeto Socket (cliente) cuando
una conexión es realizada, de modo que se puedan
enviar y recibir datos.

El ciclo de vida de un servidor básico es el siguiente:

1. Un nuevo ServerSocket es creado utilizando un puerto


específico.
2. El ServerSocket escucha por intentos de conexión
entrantes usando su método accept().
3. accept() bloquea hasta que un cliente intenta hacer
una conexión, en ese caso se retorna un objeto Socket
conectándose el cliente y el servidor.
4. Dependiendo del tipo de servidor se invocan los
métodos getInputStream y getOutputStream.
5. El servidor y el cliente interactúan de acuerdo a un
protocolo preestablecido hasta que se debe cerrar la
conexión.
6. El servidor, el cliente, o ambos cierran la conexión
7. El servidor retorna al paso 2 y espera por la
4 Taller de Procesamiento Distribuido. Guía 2
siguiente conexión.

Procedimiento

Para entender mejor el funcionamiento, crearemos una


aplicación básica con java socket.

1. Crear una Aplicación de escritorio que permita poner


como servicio (publicar) un texto especifico

a) Crear un proyecto Java Application denominado


“MinimoServidor” y programamos lo siguiente:

b) Crear un proyecto Java Application denominado “socket


” y programamos lo siguiente:
Taller de Procesamiento Distribuido. 5
Guía 2

¡Para comprobar primero debemos ejecutar el Proyecto


“MinimoServidor” y luego “MinimoCliente” y se podrá
observar en la ventana Output del servidor el texto
“Hola desde el cliente!”

Análisis de Resultados

En el proyecto anterior se puede apreciar que hay una


comunicación entre el programa servidor “MinimoSevidor” y el
programa “MinimoCliente”, ¡ya que se pudo obtener el texto
“Se logró la comunicación con el Servidor!”. Observe que el
texto aparece en la ventana Output del proyecto
“MinimoCliente” (El consumidor).
6 Taller de Procesamiento Distribuido. Guía 2

Investigación Complementaria
1. Si cuenta con 2 máquinas, modifique el código para en
una PC sea el servidor y el otro la maquina cliente
2. Vea el siguiente video https://youtu.be/avWvmkxNJCw y
responda, si construimos un servicio en un lenguaje de
programación podemos consumir desde otro Lenguaje de
Programación.

Tarea domiciliaria

1. Implemente el siguiente ejemplo que permite consolidar


los conocimientos sobre Cliente/Servidor y el protocolo
HTTP. Tomado de Computer Networking de Kurose & Ross,
segunda edición, páginas 151-155.

Este "servidor web":


1. Manipula sólo una solicitud HTTP
2. Acepta y analiza sintácticamente (parse) la solicitud HTTP
3. Busca el archivo solicitado en el sistema de archivos del
servidor
4. Crea un mensaje de respuesta HTTP consistente de líneas de
encabezado y luego el archivo solicitado
5. Envia la respuesta directamente al cliente

Si lo desea probar este código primero debe cambiar el nombre a


ServidorWebSimple.java
y luego compilar el código:

c:\>javac ServidorWebSimple.java

luego debe ejecutar el servidor

c:\>java ServidorWebSimple

y, desde un browser instalado en el mismo equipo debe escribir el


URL como:

http://127.0.0.1:6789/miarchivo.html

NOTA: asegurese que miarchivo.html esté en el mismo directorio que


el ServidorWebSimple

// Se importan los paquetes java.io y java.net


// También se importa el paquete java.util que contiene la clase
StringTokenizer que es la utilizada para
// analizar sintácticamente los mensajes de solicitud HTTP
import java.io.*;
import java.net.*;
Taller de Procesamiento Distribuido. 7
import java.util.*; Guía 2
class ServidorWebSimple {
public static void main(String argv[]) throws Exception
{

// El objeto lineaDeLaSolicitudHttp es una cadena que


contiene
// la primera linea del mensaje de solicitud HTTP
// El objeto nombreArchivo contendrá el nombre del archivo
solicitado
String lineaDeLaSolicitudHttp;
String nombreArchivo;

// El socket socketdeEscucha atenderá servicios en el puerto


6789
ServerSocket socketdeEscucha = new ServerSocket(6789);

// el método accept() de socketdeEscucha craerá un nuevo


objeto: socketdeConexion
Socket socketdeConexion = socketdeEscucha.accept();

// ahora se crean dos "streams": mensajeDesdeCliente y


mensajeParaCliente
BufferedReader mensajeDesdeCliente =
new BufferedReader(new InputStreamReader(
socketdeConexion.getInputStream()));
DataOutputStream mensajeParaCliente =
new DataOutputStream(
socketdeConexion.getOutputStream());

// se lee la primera linea del mensaje HTTP


// se supone que esta linea tiene la forma:
// GET nombre_archivo HTTP/1.0
lineaDeLaSolicitudHttp = mensajeDesdeCliente.readLine();

// Ahora el servidor debe analizar la línea para extraer el nombre


//del archivo solicitado
// El objeto lineaSeparada puede imaginarse como la linea de la
solicitud HTTP
// separa en tres partes: "GET", "nombre_archivo" y "HTTP/1.0"
StringTokenizer lineaSeparada =
new StringTokenizer(lineaDeLaSolicitudHttp);

// Se comprueba que la primera parte de lineaSeparada sea el método


GET
if (lineaSeparada.nextToken().equals("GET")) {

// Si el método es GET, entonces la siguiente palabra es el


nombre
// del archivo que el browser está solicitando
nombreArchivo = lineaSeparada.nextToken();

// Si el nombre del archivo trae un slash "/", se quita


if (nombreArchivo.startsWith("/") == true)
nombreArchivo = nombreArchivo.substring(1);
8 Taller de Procesamiento Distribuido. Guía 2

File archivo = new File(nombreArchivo);

// La siguiente línea asocia un "stream", archivoDeEntrada, al


archivo nombreArchivo
FileInputStream archivoDeEntrada = new
FileInputStream(nombreArchivo);

// las siguientes dos líneas determinan el tamaño del archivo y


construyen
// un arreglo de bytes de ese tamaño
int cantidadDeBytes = (int) archivo.length();
byte[] archivoEnBytes = new byte[cantidadDeBytes];

// La siguiente línea lee desde el "stream" archivoDeEntrada y lo


// coloca en el arreglo archivoEnBytes
archivoDeEntrada.read(archivoEnBytes);

// ahora el servidor se dispone a construir el mensaje de


respuesta
// para el browser, colocando la línea de respuesta en el
"stream" mensajeParaCliente
mensajeParaCliente.writeBytes("HTTP/1.0 200 Document Follows\r\
n");

// las siguientes líneas crean los encabezados del mensaje HTTP


// en caso de enviar una imagen en formato GIF o en formato JPEG
if (nombreArchivo.endsWith(".jpg"))
mensajeParaCliente.writeBytes("Content-Type: image/jpeg\r\n");
if (nombreArchivo.endsWith(".gif"))
mensajeParaCliente.writeBytes("Content-Type: image/gif\r\n");

// Construye luego el encabezado para indicar la longitud del


archivo
mensajeParaCliente.writeBytes("Content-Length: " +
cantidadDeBytes + "\r\n");

// Ahora envia la linea en blanco que estipula el RFC de HTTP/1.0


mensajeParaCliente.writeBytes("\r\n");

// Finalmente envía el archivo solicitado al cliente


mensajeParaCliente.write(archivoEnBytes, 0, cantidadDeBytes);

// Después de enviar el archivo, el servidor cierra el socket de


conexión
socketdeConexion.close();
}

// Si se utiliza un método diferente a GET se envía un mensaje de


error
else System.out.println("Bad Request Message");
}
}

También podría gustarte