Está en la página 1de 10

Prctica 1 Sala de Chat

Programa CLIENTE
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
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 )
{
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 );

pg. 1

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 ) {
System.err.println( "El cliente termino 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

pg. 2

// 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 );
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 );

pg. 3

salida.flush();
mostrarMensaje( "\nCLIENTE>>> " + mensaje );
}
// procesar los problemas que pueden ocurrir al enviar el objeto
catch ( IOException excepcionES ) {
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[] )

pg. 4

{
Cliente aplicacion;
if ( args.length == 0 )
aplicacion = new Cliente( "192.168.1.86" );
else
aplicacion = new Cliente( args[ 0 ] );
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
aplicacion.ejecutarCliente();
}
} // fin de la clase Cliente

Programa SERVIDOR
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
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" );
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( "" );
pg. 5

}
}
);
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.
}
// 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

pg. 6

// 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" );
}
// 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 );
}

pg. 7

// 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 )
{
// 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(

pg. 8

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
{
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 Servidor2

pg. 9

PANTALLAS

Se realiz la prctica con el fin de entender


lo que hace un cliente-servidor. Sabemos
que se utilizan para lo que son envos de
paquetes y chat en lnea. Verificar si hay
conexin entre computadoras.

pg. 10

También podría gustarte