Unidad 02.4.- Trabajo

Embed Size (px)

Citation preview

  • 8/18/2019 Unidad 02.4.- Trabajo

    1/8

    Practica 03 Procesamiento Distrib uido

    Ing. Chinga Ramos Carlos Enrique 1

    CREAR UN APLICATIVO CHAT CON SOCKET

    Proyecto ServidorChatClase: ConexionClientepackage servidorchat;

    import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import java.util.Observable;import java.util.Observer;import org.apache.log4j.Logger;

    public class ConexionCliente extends Thread implements Observer{private Logger log = Logger.getLogger(ConexionCliente.class);private Socket socket;private MensajesChat mensajes;private DataInputStream entradaDatos;private DataOutputStream salidaDatos;

    public ConexionCliente (Socket socket, MensajesChat mensajes){this.socket = socket;this.mensajes = mensajes;

    try {entradaDatos = new DataInputStream(socket.getInputStream());salidaDatos = new DataOutputStream(socket.getOutputStream());

    } catch (IOException ex) {log.error("Error al crear los stream de entrada y salida : " + ex.getMessage());

    }}

    @Override

  • 8/18/2019 Unidad 02.4.- Trabajo

    2/8

    Practica 03 Procesamiento Distrib uido

    Ing. Chinga Ramos Carlos Enrique 2

    public void run(){String mensajeRecibido;boolean conectado = true;// Se apunta a la lista de observadores de mensajesmensajes.addObserver(this);

    while (conectado) {try {

    // Lee un mensaje enviado por el clientemensajeRecibido = entradaDatos.readUTF();// Pone el mensaje recibido en mensajes para que se notifique// a sus observadores que hay un nuevo mensaje.mensajes.setMensaje(mensajeRecibido);

    } catch (IOException ex) {log.info("Cliente con la IP " + socket.getInetAddress().getHostName() + " desconectado.");conectado = false;// Si se ha producido un error al recibir datos del cliente se cierra la conexion con el.try {

    entradaDatos.close();salidaDatos.close();

    } catch (IOException ex2) {log.error("Error al cerrar los stream de entrada y salida :" + ex2.getMessage());

    }}

    }}

    @Overridepublic void update(Observable o, Object arg) {

    try {// Envia el mensaje al clientesalidaDatos.writeUTF(arg.toString());

    } catch (IOException ex) {log.error("Error al enviar mensaje al cliente (" + ex.getMessage() + ").");

    }}

    }

    Clase MensajesChat

    package servidorchat;

    import java.util.Observable;

    public class MensajesChat extends Observable{

    private String mensaje;

    public MensajesChat(){}

    public String getMensaje(){return mensaje;

    }

    public void setMensaje(String mensaje){this.mensaje = mensaje;// Indica que el mensaje ha cambiadothis.setChanged();// Notifica a los observadores que el mensaje ha cambiado y se lo pasa// (Internamente notifyObservers llama al metodo update del observador)this.notifyObservers(this.getMensaje());

    }}

  • 8/18/2019 Unidad 02.4.- Trabajo

    3/8

    Practica 03 Procesamiento Distrib uido

    Ing. Chinga Ramos Carlos Enrique 3

    Clase ServidorChat

    package servidorchat;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;

    public class ServidorChat {

    public static void main(String[] args) {

    // Carga el archivo de configuracion de log4JPropertyConfigurator.configure("log4j.properties");Logger log = Logger.getLogger(ServidorChat.class);

    int puerto = 1234;int maximoConexiones = 10; // Maximo de conexiones simultaneasServerSocket servidor = null;Socket socket = null;MensajesChat mensajes = new MensajesChat();

    try {// Se crea el serverSocketservidor = new ServerSocket(puerto, maximoConexiones);

    // Bucle infinito para esperar conexioneswhile (true) {

    log.info("Servidor a la espera de c onexiones.");socket = servidor.accept();log.info("Cliente con la IP " + socket.getInetAddress().getHostName() + " conectado.");

    ConexionCliente cc = new ConexionCliente(socket, mensajes);cc.start();

    }

    } catch (IOException ex) {log.error("Error: " + ex.getMessage());

    } finally{try {

    socket.close();servidor.close();

    } catch (IOException ex) {log.error("Error al cerrar el servidor: " + ex.getMessage());

    }}

    }}

  • 8/18/2019 Unidad 02.4.- Trabajo

    4/8

    Practica 03 Procesamiento Distrib uido

    Ing. Chinga Ramos Carlos Enrique 4

    Proyecto: ClienteChat

    Clase: ClienteChat

    package clientechat;

    import java.awt.Container;

    import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.Insets;import java.io.DataInputStream;import java.io.IOException;import java.net.Socket;import java.net.UnknownHostException;import javax.swing.*;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;

    public class ClienteChat extends JFrame {

    private Logger log = Logger.getLogger(ClienteChat.class);private JTextArea mensajesChat;private Socket socket;

    private int puerto;private String host;private String usuario;

    public ClienteChat(){super("Cliente Chat");

    // Elementos de la ventanamensajesChat = new JTextArea();mensajesChat.setEnabled(false); // El area de mensajes del chat no se debe de poder editarmensajesChat.setLineWrap(true); // Las lineas se parten al llegar al ancho del textAreamensajesChat.setWrapStyleWord(true); // Las lineas se parten entre palabras (por los espacios blancos)JScrollPane scrollMensajesChat = new JScrollPane(mensajesChat);JTextField tfMensaje = new JTextField("");

    JButton btEnviar = new JButton("Enviar");

    // Colocacion de los componentes en la ventanaContainer c = this.getContentPane();c.setLayout(new GridBagLayout());

    GridBagConstraints gbc = new GridBagConstraints();

    gbc.insets = new Insets(20, 20, 20, 20);

    gbc.gridx = 0;gbc.gridy = 0;gbc.gridwidth = 2;gbc.weightx = 1;

    gbc.weighty = 1;gbc.fill = GridBagConstraints.BOTH;c.add(scrollMensajesChat, gbc);// Restaura valores por defectogbc.gridwidth = 1;gbc.weighty = 0;

    gbc.fill = GridBagConstraints.HORIZONTAL;gbc.insets = new Insets(0, 20, 20, 20);

    gbc.gridx = 0;gbc.gridy = 1;

  • 8/18/2019 Unidad 02.4.- Trabajo

    5/8

    Practica 03 Procesamiento Distrib uido

    Ing. Chinga Ramos Carlos Enrique 5

    c.add(tfMensaje, gbc);// Restaura valores por defectogbc.weightx = 0;

    gbc.gridx = 1;gbc.gridy = 1;c.add(btEnviar, gbc);

    this.setBounds(400, 100, 400, 500);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Ventana de configuracion inicialVentanaConfiguracion vc = new VentanaConfiguracion(this);host = vc.getHost();puerto = vc.getPuerto();usuario = vc.getUsuario();

    log.info("Quieres conectarte a " + host + " en el puerto " + puerto + " con el nombre de ususario: " + usuario + ".");

    // Se crea el socket para conectar con el Sevidor del Chattry {

    socket = new Socket(host, puerto);} catch (UnknownHostException ex) {

    log.error("No se ha podido conectar con el servidor (" + ex.getMessage() + ").");} catch (IOException ex) {

    log.error("No se ha podido conectar con el servidor (" + ex.getMessage() + ").");}

    // Accion para el boton enviarbtEnviar.addActionListener(new ConexionServidor(socket, tfMensaje, usuario));

    }

    /*** Recibe los mensajes del chat reenviados por el servidor*/

    public void recibirMensajesServidor(){// Obtiene el flujo de entrada del socket

    DataInputStream entradaDatos = null;String mensaje;try {

    entradaDatos = new DataInputStream(socket.getInputStream());} catch (IOException ex) {

    log.error("Error al crear el str eam de entrada: " + ex.getMessage());} catch (NullPointerException ex) {

    log.error("El socket no se creo correctamente. ");}

    // Bucle infinito que recibe mensajes del servidorboolean conectado = true;while (conectado) {

    try {mensaje = entradaDatos.readUTF();

    mensajesChat.append(mensaje + System.lineSeparator());} catch (IOException ex) {log.error("Error al leer del stream de entrada: " + ex.getMessage());conectado = false;

    } catch (NullPointerException ex) {log.error("El socket no se creo correctamente. ");conectado = false;

    }}

    }

    /**

  • 8/18/2019 Unidad 02.4.- Trabajo

    6/8

    Practica 03 Procesamiento Distrib uido

    Ing. Chinga Ramos Carlos Enrique 6

    * @param args the command line arguments*/

    public static void main(String[] args) {// Carga el archivo de configuracion de log4JPropertyConfigurator.configure("log4j.properties");

    ClienteChat c = new ClienteChat();c.recibirMensajesServidor();

    }}

    Clase: ConexionServidorpackage clientechat;

    import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import javax.swing.JTextField;import org.apache.log4j.Logger;

    public class ConexionServidor implements ActionListener {

    private Logger log = Logger.getLogger(ConexionServidor.class);private Socket socket;private JTextField tfMensaje;private String usuario;private DataOutputStream salidaDatos;

    public ConexionServidor(Socket socket, JTextField tfMensaje, String usuario) {this.socket = socket;this.tfMensaje = tfMensaje;this.usuario = usuario;try {

    this.salidaDatos = new DataOutputStream(socket.getOutputStream());} catch (IOException ex) {

    log.error("Error al crear el stream de salida : " + ex.getMessage());} catch (NullPointerException ex) {

    log.error("El socket no se creo correctamente. ");}

    }

    @Overridepublic void actionPerformed(ActionEvent e) {

    try {salidaDatos.writeUTF(usuario + ": " + tfMensaje.getText() );tfMensaje.setText("");

    } catch (IOException ex) {log.error("Error al intentar enviar un mensaje: " + ex.getMessage());

    }}

    }

    Clase: VentanaConfiguracion

    package clientechat;

    import java.awt.Container;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.Insets;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;

  • 8/18/2019 Unidad 02.4.- Trabajo

    7/8

    Practica 03 Procesamiento Distrib uido

    Ing. Chinga Ramos Carlos Enrique 7

    import org.apache.log4j.Logger;

    public class VentanaConfiguracion extends JDialog{

    private Logger log = Logger.getLogger(VentanaConfiguracion.class);private JTextField tfUsuario;private JTextField tfHost;private JTextField tfPuerto;

    /*** Constructor de la ventana de configuracion inicial** @param padre Ventana padre*/

    public VentanaConfiguracion(JFrame padre) {super(padre, "Configuracion inicial", true);

    JLabel lbUsuario = new JLabel("Usuario:");JLabel lbHost = new JLabel("Usuario:");JLabel lbPuerto = new JLabel("Usuario:");

    tfUsuario = new JTextField();tfHost = new JTextField("localhost");tfPuerto = new JTextField("1234");

    JButton btAceptar = new JButton("Aceptar");btAceptar.addActionListener(new ActionListener() {

    @Overridepublic void actionPerformed(ActionEvent e) {

    setVisible(false);}

    });

    Container c = this.getContentPane();c.setLayout(new GridBagLayout());GridBagConstraints gbc = new GridBagConstraints();

    gbc.insets = new Insets(20, 20, 0, 20);

    gbc.gridx = 0;gbc.gridy = 0;c.add(lbUsuario, gbc);

    gbc.gridx = 0;gbc.gridy = 1;c.add(lbHost, gbc);

    gbc.gridx = 0;gbc.gridy = 2;c.add(lbPuerto, gbc);

    gbc.ipadx = 100;gbc.fill = GridBagConstraints.HORIZONTAL;

    gbc.gridx = 1;gbc.gridy = 0;c.add(tfUsuario, gbc);

    gbc.gridx = 1;gbc.gridy = 1;c.add(tfHost, gbc);

    gbc.gridx = 1;gbc.gridy = 2;c.add(tfPuerto, gbc);

  • 8/18/2019 Unidad 02.4.- Trabajo

    8/8

    Practica 03 Procesamiento Distrib uido

    Ing. Chinga Ramos Carlos Enrique 8

    gbc.gridx = 0;gbc.gridy = 3;gbc.gridwidth = 2;gbc.insets = new Insets(20, 20, 20, 20);c.add(btAceptar, gbc);

    this.pack(); // Le da a la ventana el minimo tamaño posible

    this.setLocation(450, 200); // Posicion de la ventanathis.setResizable(false); // Evita que se pueda estirar la ventanathis.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); // Deshabilita el boton de cierre de la ventanathis.setVisible(true);

    }

    public String getUsuario(){return this.tfUsuario.getText();

    }

    public String getHost(){return this.tfHost.getText();

    }

    public int getPuerto(){return Integer.parseInt(this.tfPuerto.getText());

    }}