Sie sind auf Seite 1von 23

UNIVERSIDAD CENTROAMERICANA

Pg. No. 1 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
Gua de Ejercicio #8: Sockets Datagrama y Sockets en Modo Stream
Objetivo: Aplicar las tcnicas bsicas de sincronizacin y distribucin para el envo y
recepcin de mensajes utilizando Sockets Datagrama (sin conexin) y Sockets en Modo
Stream (con conexin).
Ejercicio #8.1: Socket de Datagrama Sin Conexin (Simplex)

Emisor_SDSC.java
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* Llamadas de mtodos bsicas para sockets datagrama sin conexin
*/
public class Emisor_SDSC {
// Una aplicacin que manda un mensaje utilizando un socket datagrama
// sin conexin.
// Se esperan tres argumentos de lnea de mandato, en orden:
// <nombre del dominio o direccin IP del receptor>
// <nmero del puerto del socket del receptor>
// <mensaje, una cadena, para mandar>
public static void main(String[ ] args) {
if (args.length != 3)
System.out.println
("Este programa requiere 3 argumentos de lnea de mandato");
else {
try {
InetAddress maquinaReceptora = InetAddress.getByName(args[0]);
Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 2 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
int puertoReceptor = Integer.parseInt(args[1]);
String mensaje = args[2];
// instancia un socket datagrama para mandar los datos
DatagramSocket miSocket = new DatagramSocket( );
byte[ ] almacen = mensaje.getBytes( );
DatagramPacket datagrama =
new DatagramPacket(almacen, almacen.length,
maquinaReceptora, puertoReceptor);
miSocket.send(datagrama);
miSocket.close( );
} // fin de try
catch (Exception ex) {
ex.printStackTrace( );
} // fin de catch
} // fin de else
} // fin de main
} // fin de class

Receptor_SDSC.java
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
* Llamadas de mtodos bsicas para sockets datagrama sin conexin.
*/
public class Receptor_SDSC {
//
//
//
//
//
//

Una aplicacin que recibe un mensaje utilizando un socket datagrama


sin conexin.
Se espera un argumento de lnea de mandato:
<nmero de puerto del socket del receptor>
Nota: se debera especificar el mismo nmero de puerto
en los argumentos de lnea de mandato del emisor.

public static void main(String[] args) {


if (args.length != 1)
System.out.println
("Este programa requiere un argumento de lnea de mandato.");
else {
int puerto = Integer.parseInt(args[0]);
final int MAX_LON = 50;

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 3 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
// Esta es la longitud mxima asumida en octetos
// del datagrama que se va a recibir.
try {
DatagramSocket miSocket = new DatagramSocket(puerto);
// instancia un socket datagrama para recibir los datos
byte[ ] almacen = new byte[MAX_LON];
DatagramPacket datagrama =
new DatagramPacket(almacen, MAX_LON);
miSocket.receive(datagrama);
String mensaje = new String(almacen);
System.out.println(mensaje);
miSocket.close( );
} // fin de try
catch (Exception ex) {
ex.printStackTrace( );
} // fin de catch
} // fin de else
} // fin de main
} // fin de class

Salida

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 4 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
Ejercicio #8.2: Socket de Datagrama Sin Conexin (Duplex)

EmisorReceptor_SDSC.java
import java.net.InetAddress;
/*
Un proceso que enva y despus recibe utilizando un socket datagrama.
*/
public class EmisorReceptor_SDSC {
// Una aplicacin que manda y que despus recibe un mensaje utilizando
// un socket datagrama sin conexin.
// Se esperan cuatro argumentos de lnea de mandato, en orden:
// <nombre de dominio o direccin IP del receptor>
// <nmero de puerto del socket datagrama del receptor>
// <nmero de puerto del socket datagrama de este proceso>
// <mensaje, una cadena, para mandar>
public static void main(String[ ] args) {
if (args.length != 4)
System.out.println
("Este programa requiere 4 argumentos de lnea de mandato");
else {
try {
InetAddress maquinaReceptora = InetAddress.getByName(args[0]);
int puertoReceptor = Integer.parseInt(args[1]);
int miPuerto = Integer.parseInt(args[2]);
String mensaje = args[3];
MiSocketDatagrama miSocket = new MiSocketDatagrama(miPuerto);
// instancia un socket datagrama para enviar
// y recibir datos
Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 5 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
miSocket.enviaMensaje( maquinaReceptora, puertoReceptor, mensaje);
// ahora espera recibir un datagrama por el socket
System.out.println(miSocket.recibeMensaje());
miSocket.close( );
} // fin de try
catch (Exception ex) {
ex.printStackTrace();
} // fin de catch
} // fin de else
} // fin de main
} // fin de class

ReceptorEmisor_SDSC.java
import java.net.InetAddress;
/*
Un proceso que recibe un mensaje y despus lo enva utilizando un socket
datagrama.
*/
public class ReceptorEmisor_SDSC {
// Una aplicacin que recibe un mensaje y despus lo manda utilizando
// un socket datagrama sin conexin.
// Se esperan cuatro argumentos de lnea de mandato, en orden:
// <nombre de dominio o direccin IP del receptor>
// <nmero de puerto del socket datagrama del receptor>
// <nmero de puerto del socket datagrama de este proceso>
// <mensaje, una cadena, para mandar>
public static void main(String[ ] args) {
if (args.length != 4)
System.out.println
("Este programa requiere 4 argumentos de lnea de mandato");
else {
try {
InetAddress maquinaReceptora = InetAddress.getByName(args[0]);
int puertoReceptor = Integer.parseInt(args[1]);
int miPuerto = Integer.parseInt(args[2]);
String mensaje = args[3];
// instancia un socket datagrama para enviar
// y recibir datos
MiSocketDatagrama miSocket = new MiSocketDatagrama(miPuerto);
// Primero espera a recibir un datagrama por el socket

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 6 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
System.out.println(miSocket.recibeMensaje());
// Ahora enva un mensaje al otro proceso.
miSocket.enviaMensaje(maquinaReceptora, puertoReceptor, mensaje);
miSocket.close( );
} // fin de try
catch (Exception ex) {
ex.printStackTrace( );
}// fin de catch
} // fin de else
} // fin de main
} // fin de class

MiSocketDatagrama.java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
Una subclase de DatagramSocket que contiene mtodos para mandar y recibir
mensajes.
*/
public class MiSocketDatagrama extends DatagramSocket {
static final int MAX_LON = 50;
MiSocketDatagrama(int numPuerto) throws SocketException {
super(numPuerto);
}
public void enviaMensaje(InetAddress maquinaReceptora, int puertoReceptor,
String mensaje) throws IOException {
byte[ ] almacenEnvio = mensaje.getBytes( );
DatagramPacket datagrama =
new DatagramPacket(almacenEnvio, almacenEnvio.length,
maquinaReceptora, puertoReceptor);
this.send(datagrama);
} // fin de enviaMensaje
public String recibeMensaje( )
throws IOException {
byte[ ] almacenRecepcion = new byte[MAX_LON];

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 7 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
DatagramPacket datagrama =
new DatagramPacket(almacenRecepcion, MAX_LON);
this.receive(datagrama);
String mensaje = new String(almacenRecepcion);
return mensaje;
} // fin de recibeMensaje
} // fin de class

Salida

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 8 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
Ejercicio #8.3: Socket en Modo Stream (Con Conexin)

SolicitarConexion.java
/* El API de sockets en Modo Stream. Sincronizacin de Eventos. Sintaxis bsica
del socket.
Una aplicacin que solicita una conexin y manda un mensaje utilizando un
socket en modo stream. Se esperan dos argumentos de lnea de mandato, en
orden: <nombre de la mquina del aceptador de la conexin> <nmero de
puerto del aceptador de la conexin> */
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
public class SolicitarConexion
{
public static void main (String[] args)
{
if (args.length != 2)
System.out.println("\nEste programa requiere de dos argumentos de linea de
comando");
else
{
try
{
InetAddress maquinaAceptadora = InetAddress.getByName(args [0]);
int puertoAceptador = Integer.parseInt(args[1]);
Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 9 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
// instanciar un socket de datos
Socket miSocket = new Socket (maquinaAceptadora, puertoAceptador);
System.out.println("\nSolicitud de conexion concedida");
//obtiene un flujo de entrada para leer los socket de datos
InputStream flujoEntrada = miSocket.getInputStream();
// crea un objeto BufferedReader para la entrada en modo carcter
BufferedReader socketInput = new BufferedReader(new InputStreamReader
(flujoEntrada));
System.out. println("\nEsperando leer");
//lee una lnea del flujo de datos
String mensaje = socketInput.readLine();
System.out.println("\nEl mensaje recibido es: " + mensaje);
miSocket.close();
System.out.println("\nSocket de datos cerrado\n\n");
}//fin try
catch(Exception ex)
{
}//fin de catch
}//fin de else
}//fin del mtodo main()
}//fin de la clase SolicitarConexion

AceptarConexion.java
/* Una aplicacin que acepta una conexin y recibe un mensaje utilizando un
socket en modo Stream. Sintaxis bsica del socket.
Se esperan dos argumentos de lnea de mandato, en orden: <nmero de puerto
del socket del servidor utilizado en este proceso> <mensaje, una cadena,
para mandar> */
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class AceptarConexion
{
public static void main (String[] args)
{
if (args.length != 2)
System.out.println("\nEste programa requiere de dos argumentos de linea de
comando");

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 10 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
else
{
try
{
int numPuerto = Integer.parseInt(args [0]);
String mensaje = args[1];
//instanciar un socket para aceptar la conexin
ServerSocket socketConexion = new ServerSocket (numPuerto);
System.out.println("\nPreparado para aceptar una conexion");
/*espera una peticin de conexin,instante en el cual se crea un
socket de datos */
Socket socketDatos = socketConexion.accept();
System.out.println("\nConexion aceptada");
//obtiene un flujo de salida para escribir en el socket de datos
OutputStream flujoSalida = socketDatos.getOutputStream();
//crea un objeto PrintWriter para la salida en modo carcter
PrintWriter
salidaSocket
=
new
PrintWriter(new
OutputStreamWriter(flujoSalida));
//escribe un mensaje en el flujo de datos
salidaSocket.println(mensaje);
/*la subsiguiente llamada al mtodo flush es necesaria para que los
datos se escriban en el flujo de datos del socket antes de que se
cierre el socket.*/
salidaSocket.flush();
System.out.println("\nMensaje enviado");
socketDatos.close();
System.out.println("\nSocket de datos cerrado");
socketConexion.close();
System.out.println("\nSocket de conexion cerrado\n\n");
}//fin de try
catch(Exception ex)
{
}//fin de catch
}//fin de else
}//fin del mtodo main()
}//fin de la clase AceptarConexion

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 11 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
Salida

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 12 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
Ejercicio #8.4: Conexin Cliente - Servidor

Cliente.java
// Cliente que lee y muestra la informacin que le enva un Servidor.
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import javax.swing.*;
public class Cliente extends JFrame {
private JTextField campoIntroducir;
private JTextArea areaPantalla;
private ObjectOutputStream salida;
private ObjectInputStream entrada;
private String mensaje = "";
private String servidorChat;
private Socket cliente;
// inicializar servidorChat y configurar GUI
public Cliente( String host )
{

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 13 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
super( "Cliente" );
servidorChat = host; // establecer el servidor al que se va a conectar este cliente
Container contenedor = getContentPane();
// crear campoIntroducir y registrar componente de escucha
campoIntroducir = new JTextField();
campoIntroducir.setEditable( false );
campoIntroducir.addActionListener(
new ActionListener() {
// enviar mensaje al servidor
public void actionPerformed( ActionEvent evento )
{
enviarDatos( evento.getActionCommand() );
campoIntroducir.setText( "" );
}
}
);
contenedor.add( campoIntroducir, BorderLayout.NORTH );
// crear areaPantalla
areaPantalla = new JTextArea();
contenedor.add( new JScrollPane( areaPantalla ),
BorderLayout.CENTER );
setSize( 300, 150 );
setVisible( true );
} // fin del constructor de Cliente
// conectarse al servidor y procesar mensajes del servidor
private void ejecutarCliente()
{
// conectarse al servidor, obtener flujos, procesar la conexin
try {
conectarAServidor(); // Paso 1: crear un socket para realizar la conexin
obtenerFlujos();
// Paso 2: obtener los flujos de entrada y salida
procesarConexion(); // Paso 3: procesar la conexin
}
// el servidor cerr la conexin
catch ( EOFException excepcionEOF ) {

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 14 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
System.err.println( "El cliente termin la conexin" );
}
// procesar los problemas que pueden ocurrir al comunicarse con el servidor
catch ( IOException excepcionES ) {
excepcionES.printStackTrace();
}
finally {
cerrarConexion(); // Paso 4: cerrar la conexin
}
} // fin del mtodo ejecutarCliente
// conectarse al servidor
private void conectarAServidor() throws IOException
{
mostrarMensaje( "Intentando realizar conexin\n" );
// crear Socket para realizar la conexin con el servidor
cliente = new Socket( InetAddress.getByName( servidorChat ), 12345 );
// mostrar la informacin de la conexin
mostrarMensaje( "Conectado a: " +
cliente.getInetAddress().getHostName() );
}
// obtener flujos para enviar y recibir datos
private void obtenerFlujos() throws IOException
{
// establecer flujo de salida para los objetos
salida = new ObjectOutputStream( cliente.getOutputStream() );
salida.flush(); // vacar bfer de salida para enviar informacin de encabezado
// establecer flujo de entrada para los objetos
entrada = new ObjectInputStream( cliente.getInputStream() );
mostrarMensaje( "\nSe recibieron los flujos de E/S\n" );
}
// procesar la conexin con el servidor
private void procesarConexion() throws IOException
{
// habilitar campoIntroducir para que el usuario del cliente pueda enviar mensajes
establecerCampoTextoEditable( true );

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 15 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
do { // procesar mensajes enviados del servidor
// leer mensaje y mostrarlo en pantalla
try {
mensaje = ( String ) entrada.readObject();
mostrarMensaje( "\n" + mensaje );
}
// atrapar los problemas que pueden ocurrir al leer del servidor
catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {
mostrarMensaje( "\nSe recibi un objeto de tipo desconocido" );
}
} while ( !mensaje.equals( "SERVIDOR >>> TERMINAR" ) );
} // fin del mtodo procesarConexion
// cerrar flujos y socket
private void cerrarConexion()
{
mostrarMensaje( "\nCerrando conexin" );
establecerCampoTextoEditable( false ); // deshabilitar campoIntroducir
try {
salida.close();
entrada.close();
cliente.close();
}
catch( IOException excepcionES ) {
excepcionES.printStackTrace();
}
}
// enviar mensaje al servidor
private void enviarDatos( String mensaje )
{
// enviar objeto al servidor
try {
salida.writeObject( "CLIENTE >>> " + mensaje );
salida.flush();
mostrarMensaje( "\nCLIENTE >>> " + mensaje );
}
// procesar los problemas que pueden ocurrir al enviar el objeto
catch ( IOException excepcionES ) {

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 16 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
areaPantalla.append( "\nError al escribir el objeto" );
}
}
// mtodo utilitario que es llamado desde otros subprocesos para manipular a
// areaPantalla en el subproceso despachador de eventos
private void mostrarMensaje( final String mensajeAMostrar )
{
// mostrar mensaje del subproceso de ejecucin de la GUI
SwingUtilities.invokeLater(
new Runnable() { // clase interna para asegurar que la GUI se actualice
apropiadamente
public void run() // actualiza areaPantalla
{
areaPantalla.append( mensajeAMostrar );
areaPantalla.setCaretPosition(
areaPantalla.getText().length() );
}
} // fin de la clase interna
); // fin de la llamada a SwingUtilities.invokeLater
}
// mtodo utilitario que es llamado desde otros subprocesos para manipular a
// campoIntroducir en el subproceso despachador de eventos
private void establecerCampoTextoEditable( final boolean editable )
{
// mostrar mensaje del subproceso de ejecucin de la GUI
SwingUtilities.invokeLater(
new Runnable() { // clase interna para asegurar que la GUI se actualice
apropiadamente
public void run() // establece la capacidad de modificar campoIntroducir
{
campoIntroducir.setEditable( editable );
}
} // fin de la clase interna
); // fin de la llamada a SwingUtilities.invokeLater
}
public static void main( String args[] )

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 17 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
{
Cliente aplicacion;
if ( args.length == 0 )
aplicacion = new Cliente( "127.0.0.1" );
else
aplicacion = new Cliente( args[ 0 ] );
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
aplicacion.ejecutarCliente();
}
} // fin de la clase Cliente

Servidor.java
// Configurar un servidor que reciba una conexin de un cliente, enve
// una cadena al cliente y cierre la conexin.
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.*;
public class Servidor extends JFrame {
private JTextField campoIntroducir;
private JTextArea areaPantalla;
private ObjectOutputStream salida;
private ObjectInputStream entrada;
private ServerSocket servidor;
private Socket conexion;
private int contador = 1;
// configurar GUI
public Servidor()
{
super( "Servidor" );

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 18 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015

Container contenedor = getContentPane();


// crear campoIntroducir y registrar componente de escucha
campoIntroducir = new JTextField();
campoIntroducir.setEditable( false );
campoIntroducir.addActionListener(
new ActionListener() {
// enviar mensaje al cliente
public void actionPerformed( ActionEvent evento )
{
enviarDatos( evento.getActionCommand() );
campoIntroducir.setText( "" );
}
}
);
contenedor.add( campoIntroducir, BorderLayout.NORTH );
// crear areaPantalla
areaPantalla = new JTextArea();
contenedor.add( new JScrollPane( areaPantalla ),
BorderLayout.CENTER );
setSize( 300, 150 );
setVisible( true );
} // fin del constructor de Servidor
// configurar y ejecutar el servidor
public void ejecutarServidor()
{
// configurar servidor para que reciba conexiones; procesar las conexiones
try {
// Paso 1: crear un objeto ServerSocket.
servidor = new ServerSocket( 12345, 100 );
while ( true ) {
try {
esperarConexion(); // Paso 2: esperar una conexin.
obtenerFlujos();
// Paso 3: obtener flujos de entrada y salida.
procesarConexion(); // Paso 4: procesar la conexin.

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 19 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
}
// procesar excepcin EOFException cuando el cliente cierre la conexin
catch ( EOFException excepcionEOF ) {
System.err.println( "El servidor termin la conexin" );
}
finally {
cerrarConexion(); // Paso 5: cerrar la conexin.
++contador;
}
} // fin de instruccin while
} // fin del bloque try
// procesar problemas con E/S
catch ( IOException excepcionES ) {
excepcionES.printStackTrace();
}
} // fin del mtodo ejecutarServidor
// esperar que la conexin llegue, despus mostrar informacin de la conexin
private void esperarConexion() throws IOException
{
mostrarMensaje( "Esperando una conexin\n" );
conexion = servidor.accept(); // permitir al servidor aceptar la conexin
mostrarMensaje( "Conexin " + contador + " recibida de: " +
conexion.getInetAddress().getHostName() );
}
// obtener flujos para enviar y recibir datos
private void obtenerFlujos() throws IOException
{
// establecer flujo de salida para los objetos
salida = new ObjectOutputStream( conexion.getOutputStream() );
salida.flush(); // vaciar bfer de salida para enviar informacin de encabezado
// establecer flujo de entrada para los objetos
entrada = new ObjectInputStream( conexion.getInputStream() );
mostrarMensaje( "\nSe recibieron los flujos de E/S\n" );
}

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 20 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
// procesar la conexin con el cliente
private void procesarConexion() throws IOException
{
// enviar mensaje de conexin exitosa al cliente
String mensaje = "Conexin exitosa";
enviarDatos( mensaje );
// habilitar campoIntroducir para que el usuario del servidor pueda enviar mensajes
establecerCampoTextoEditable( true );
do { // procesar los mensajes enviados por el cliente
// leer el mensaje y mostrarlo en pantalla
try {
mensaje = ( String ) entrada.readObject();
mostrarMensaje( "\n" + mensaje );
}
// atrapar problemas que pueden ocurrir al tratar de leer del cliente
catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {
mostrarMensaje( "\nSe recibi un tipo de objeto desconocido" );
}
} while ( !mensaje.equals( "CLIENTE >>> TERMINAR" ) );
} // fin del mtodo procesarConexion
// cerrar flujos y socket
private void cerrarConexion()
{
mostrarMensaje( "\nFinalizando la conexin\n" );
establecerCampoTextoEditable( false ); // deshabilitar campoIntroducir
try {
salida.close();
entrada.close();
conexion.close();
}
catch( IOException excepcionES ) {
excepcionES.printStackTrace();
}
}
// enviar mensaje al cliente
private void enviarDatos( String mensaje )

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 21 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
{
// enviar objeto al cliente
try {
salida.writeObject( "SERVIDOR >>> " + mensaje );
salida.flush();
mostrarMensaje( "\nSERVIDOR >>> " + mensaje );
}
// procesar problemas que pueden ocurrir al enviar el objeto
catch ( IOException excepcionES ) {
areaPantalla.append( "\nError al escribir objeto" );
}
}
// mtodo utilitario que es llamado desde otros subprocesos para manipular a
// areaPantalla en el subproceso despachador de eventos
private void mostrarMensaje( final String mensajeAMostrar )
{
// mostrar mensaje del subproceso de ejecucin despachador de eventos
SwingUtilities.invokeLater(
new Runnable() { // clase interna para asegurar que la GUI se actualice
apropiadamente
public void run() // actualiza areaPantalla
{
areaPantalla.append( mensajeAMostrar );
areaPantalla.setCaretPosition(
areaPantalla.getText().length() );
}
} // fin de la clase interna
); // fin de la llamada a SwingUtilities.invokeLater
}
// mtodo utilitario que es llamado desde otros subprocesos para manipular a
// campoIntroducir en el subproceso despachador de eventos
private void establecerCampoTextoEditable( final boolean editable )
{
// mostrar mensaje del subproceso de ejecucin despachador de eventos
SwingUtilities.invokeLater(
new Runnable() { // clase interna para asegurar que la GUI se actualice
apropiadamente
public void run() // establece la capacidad de modificar a campoIntroducir

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 22 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015
{
campoIntroducir.setEditable( editable );
}
} // fin de la clase interna
); // fin de la llamada a SwingUtilities.invokeLater
}
public static void main( String args[] )
{
Servidor aplicacion = new Servidor();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
aplicacion.ejecutarServidor();
}
} // fin de la clase Servidor

Salida

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

UNIVERSIDAD CENTROAMERICANA
Pg. No. 23 de 23
Facultad de Ciencia, Tecnologa y Ambiente / Coordinacin ISTI
Arquitectura de Sistemas Concurrentes IIIC2015

Ingeniera en Sistemas y Tecnologas de la Informacin

CML - 2015

Das könnte Ihnen auch gefallen