Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SISTEMA DISTRIBUIDOS
Presentado por:
FELIPE SERRANO ZAMORA
COD: 1033685327
Tutor:
CARLOS HERNAN SILVA
SISTEMAS DISTRIBUIDOS
INGENIERIA DE SISTEMAS - ECBTI
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
BOGOTA DC. – OCTUBRE DE 2013
INTRODUCCION
Este informe, consiste en la realización de un Socket, para la comprobación de la
conexión del Cliente – Servidor, elaborado mediante el lenguaje de programación
Java. Por eso se puede dar una prueba básica en la conexión del Cliente- Servidor
y su funcionamiento y dar base para la realización de los sistemas distribuidos
basándose en esta práctica.
OBJETIVOS
General:
Elaborar una aplicación distribuida cliente – servidor.
Específicos:
Crear una aplicación socket de cliente – servidor en lenguaje Java.
Comprobar el funcionamiento de la aplicación.
PRACTICA DE LABORATORIO Nº 1
1. Marco teórico
Arquitectura cliente-servidor
La arquitectura cliente-servidor es un modelo de aplicación distribuida en el que
las tareas se reparten entre los proveedores de recursos o servicios, llamados
servidores, y los demandantes, llamados clientes. Un cliente realiza peticiones a
otro programa, el servidor, quien le da respuesta. Esta idea también se puede
aplicar a programas que se ejecutan sobre una sola computadora, aunque es más
ventajosa en un sistema operativo multiusuario distribuido a través de una red de
computadoras.
En esta arquitectura la capacidad de proceso está repartida entre los clientes y los
servidores, aunque son más importantes las ventajas de tipo organizativo debidas
a la centralización de la gestión de la información y la separación de
responsabilidades, lo que facilita y clarifica el diseño del sistema.
La separación entre cliente y servidor es una separación de tipo lógico, donde el
servidor no se ejecuta necesariamente sobre una sola máquina ni es
necesariamente un sólo programa. Los tipos específicos de servidores incluyen los
servidores web, los servidores de archivo, los servidores del correo, etc. Mientras
que sus propósitos varían de unos servicios a otros, la arquitectura básica seguirá
siendo la misma.
Una disposición muy común son los sistemas multicapa en los que el servidor se
descompone en diferentes programas que pueden ser ejecutados por diferentes
computadoras aumentando así el grado de distribución del sistema.
La arquitectura cliente-servidor sustituye a la arquitectura monolítica en la que no
hay distribución, tanto a nivel físico como a nivel lógico.
La red cliente-servidor es aquella red de comunicaciones en la que todos los
clientes están conectados a un servidor, en el que se centralizan los diversos
recursos y aplicaciones con que se cuenta; y que los pone a disposición de los
clientes cada vez que estos son solicitados. Esto significa que todas las gestiones
que se realizan se concentran en el servidor, de manera que en él se disponen los
requerimientos provenientes de los clientes que tienen prioridad, los archivos que
son de uso público y los que son de uso restringido, los archivos que son de sólo
lectura y los que, por el contrario, pueden ser modificados, etc. Este tipo de red
puede utilizarse conjuntamente en caso de que se esté utilizando en una red
mixta.
Socket
Socket designa un concepto abstracto por el cual dos programas (posiblemente
situados en computadoras distintas) pueden intercambiar cualquier flujo de datos,
generalmente de manera fiable y ordenada.
El término socket es también usado como el nombre de una interfaz de
programación de aplicaciones (API) para la familia de protocolos de Internet
TCP/IP, provista usualmente por el sistema operativo.
Los sockets de Internet constituyen el mecanismo para la entrega de paquetes de
datos provenientes de la tarjeta de red a los procesos o hilos apropiados. Un
socket queda definido por un par de direcciones IP local y remota, un protocolo de
transporte y un par de números de puerto local y remoto.
Sockets en Java
Los sockets son básicamente formas en las que podemos interconectar 2 (o más)
programas mediante el uso de la internet. En java se utilizan para poder crear
conexiones utilizando básicamente una IP/hostname y un puerto para establecer
la conexión. Para aprender podemos utilizarla para conectar 2 programas por
medio de Internet.
¿Cómo funciona?
El modelo más básico de los sockets consta de 2 simples programas, un servidor
y un cliente. Básicamente el programa servidor comienza a “escuchar” en un
puerto determinado (nosotros lo especificamos), y posteriormente el programa que
la hace de “cliente” debe conocer la ip o nombre de dominio/hostname del servidor
y el puerto que está escuchando, al saber esto simplemente solicita establecer
una conexión con el servidor. Es aquí cuando el servidor acepta esa conexión y se
puede decir que estos programas están “conectados”, de este modo pueden
intercambiar información. En el siguiente video muestro un programa servidor con
sockets, explico más o menos el código, en que consiste y hago una prueba en el
cual la conexión es exitosa.
2. Desarrollo de la práctica.
1) Consultar el código en lenguaje de programación Java para el cliente.
// Cliente que lee y muestra la
información que le envía un enviarDatos( evento.getActionComm
Servidor. and() );
import java.io.*;
import java.net.*; campoIntroducir.setText( "" );
import java.awt.*; }
import java.awt.event.*; }
import javax.swing.*; );
if ( args.length == 0 )
aplicacion = new
Cliente( "127.0.0.1" );
else
aplicacion = new
Cliente( args[ 0 ] );
aplicacion.setDefaultCloseOperati
on( JFrame.EXIT_ON_CLOSE );
aplicacion.ejecutarCliente();
}
private JTextField
Campo_Introduccion; Campo_Introduccion.setText( "" );
private ObjectOutputStream }
Salida; );
private ObjectInputStream
Entrada;
private String Mensaje = ""; contenedor.add( Campo_Introduccion,
private String Servidor_Chat; BorderLayout.NORTH );
Campo_Introduccion = new
JTextField(); private void ejecutarCliente()
{
Campo_Introduccion.setEditable( fal
se );
try {
Campo_Introduccion.addActionListene conectarAServidor();
r(
obtenerFlujos();
Cliente.getInetAddress().getHostNam
procesarConexion(); e() );
} }
} }
try {
Cliente = new Mensaje = ( String )
Socket( InetAddress.getByName( Serv Entrada.readObject();
idor_Chat ), 12345 );
mostrarMensaje( "\n" +
Mensaje );
mostrarMensaje( "Conectado a: }
" +
catch
( ClassNotFoundException Salida.writeObject( "CLIENTE>>> " +
excepcionClaseNoEncontrada ) { mensaje );
mostrarMensaje( "\nSe Salida.flush();
recibió un objeto de caracter
desconocido" );
mostrarMensaje( "\nCLIENTE>>> " +
} mensaje );
}
} while ( !
Mensaje.equals( "SERVIDOR>>>
TERMINAR" ) ); catch ( IOException
excepcionES ) {
} Area_Pantalla.append( "\nError al
escribir el objeto" );
}
private void cerrarConexion()
}
{
mostrarMensaje( "\nCerrar la
conexión con el servidor..." ); private void
mostrarMensaje( final String
establecerCampoTextoEditable( mensajeAMostrar )
false );
{
try {
Salida.close();
SwingUtilities.invokeLater(
Entrada.close();
new Runnable() {
Cliente.close();
}
public void run()
catch( IOException
excepcionES ) { {
}
try { );
} );
}
private void
establecerCampoTextoEditable( final
boolean editable ) public static void main( String
args[] )
{
{
Cliente aplicacion;
SwingUtilities.invokeLater(
new Runnable() {
if ( args.length == 0 )
aplicacion = new
public void run() Cliente( "127.0.0.1" );
{ else
aplicacion = new
Campo_Introduccion.setEditable( edi Cliente( args[ 0 ] );
table );
}
aplicacion.setDefaultCloseOperation
( JFrame.EXIT_ON_CLOSE );
}
aplicacion.ejecutarCliente();
}
public Servidor()
public class Servidor extends
JFrame { {
private JTextField super( "Servidor" );
Campo_Introduccion;
private JTextArea Area_Pantalla;
Container contenedor =
private ObjectOutputStream getContentPane();
Salida;
Campo_Introduccion = new {
JTextField();
Servidor = new
Campo_Introduccion.addActionListene ServerSocket( 12345, 100 );
r(
new ActionListener() {
while ( true ) {
public void
actionPerformed( ActionEvent evento try {
)
esperarConexion();
{
obtenerFlujos();
Campo_Introduccion.setText( "" );
catch ( EOFException
} excepcionEOF ) {
}
); System.err.println( "Conexion con
el servidor terminada" );
}
contenedor.add( Campo_Introduccion,
BorderLayout.NORTH ); finally {
cerrarConexion();
Area_Pantalla = new ++Contador;
JTextArea();
}
contenedor.add( new
JScrollPane( Area_Pantalla ),
BorderLayout.CENTER ); }
setVisible( true );
} catch ( IOException
excepcionES ) {
{
try { new Runnable() { // clase
interna para asegurar que la GUI se
Salida.close(); actualice apropiadamente
Entrada.close();
Conexion.close(); public void run() //
} actualiza areaPantalla
catch( IOException {
excepcionES ) {
Area_Pantalla.append( mensajeAMostr
excepcionES.printStackTrace(); ar );
}
Area_Pantalla.setCaretPosition(
}
Area_Pantalla.getText().length() );
private void enviarDatos( String }
mensaje )
{
}
try {
); aplicacion.setDefaultCloseOperation
} ( JFrame.EXIT_ON_CLOSE );
aplicacion.ejecutarServidor();
public static void main( String
args[] ) }
{
}
4) Comprobar su conexión y funcionamiento.
Así quedo funcionado el socket, y probar la conexión del cliente –servidor y su uso
básico que pueda determinar la manera de funcionar mediante dicha aplicación.
CONCLUSIONES
La práctica de laboratorio de exitosa.
El funcionamiento de la aplicación del Socket es un éxito.
La conexión de dicha aplicación se funciona con base en su funcionamiento.
BIBLIOGRAFIA
es.wikipedia.org
http://codigoprogramacion.com/cursos/java/103-sockets-en-java-con-cliente-y-
servidor.html