Upload
miguel-angel-castillo
View
215
Download
0
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());
}}