El protocolo de comunicación entre el cliente y el servidor es el siguiente: Del cliente al servidor: • El cliente envía un 1 para solicitar que el servidor valide en la BD los datos de autenticación. • El cliente envía un 2 al servidor para realizar una primera consulta realizada por el usuario en la cual se cargará en otro formulario una lista con todos los nombre de empleados que cumplan los criterios de búsqueda seleccionados para que el usuario elija uno de ellos y ver así el detalle de su ficha. • El cliente envía un 3 para que el servidor pida a la BD los nombres de departamentos existentes y cargarlos en el choice de applet cuando el cliente quiere dar un alta. De este modo, el cliente solo podrá elegir entre los departamentos ya existentes a la hora de crear un nuevo empleado • El cliente envía un 4 cuando el usuario quiere dar de alta un nuevo empleado una vez rellenados todos sus campos. • El cliente envía un 5 al servidor para que busque en la BD el registro correspondiente al departamento asociado al nuevo empelado que ha dado de alta el usuario. • El cliente envía un 6 cuando el usuario ha seleccionado un empleado concreto en la lista y quiere ver el detalle de su condulta. • El cliente envía un 7 al servidor cuando quiere cerrar la aplicación y de ese modo solicita la desconexión con el servidor matando el hilo. La clase Hilo.class generada por el servidor evalua en un while true (hasta que se desconecte el cliente) mediante un switch el número que le mande el cliente para tratar de forma correcta su petición. Del servidor al cliente: • El Servidor envía un 1 al cliente cuando su solicitud ha sido procesada con éxito. • El servidor envía un número distinto de 1 cuando se ha producido algún error en su solicitud. De esta forma, el cliente siempre sabe si su petición al servidor ha sido o no satisfactoria. GESTIÓN DE EMPLEADOS La aplicación consiste en una herramienta a la que se tendrá acceso desde Internet o dentro de una red local orientada a business to business capaz de realizar búsquedas de la localización de empleados dentro de una empresa mostrando información relativa al cargo que ocupa en la empresa, así como su localización geográfica dentro la misma, es decir, la planta y el departamento en el que se encuentra. También se podrá dar de alta nuevos empleados en la base de datos asignándole un código de empleado y su localización geográfica correspondiente. Todo esto se realizará tras una previa identificación con usuario y password ya que sólo tendrán acceso a la aplicación los usuarios registrados. El usuario dispondrá de diversas pantallas para realizar las búsquedas y ejecutar altas. Tras identificarse como usuario registrado, tendrá dos opciones: o bien puede dar de alta un nuevo empleado, o bien puede realizar una consulta por código de empleado ,por nombre de empleado, o por ambos campos juntos. De esta consulta pueden salir varios empleados que cumplan los criterios de búsqueda, por ello, todos los empleados resultantes de dicha búsqueda, apareceran en una lista para que el usuario seleccione pinchando en el que le interesa, mostrándose así los datos personales de dicho empleado. 1 Para realizar un alta, deberá rellenar los campos que se le solicitan y elegir ,de entre varios posibles, el departamento en el que desea ubicarlo. El usuario podrá abandonar la aplicación en el momento que lo desee tan solo pulsando un botón. FUENTES Inicio.java import java.awt.*; import java.applet.Applet; import java.awt.event.*; import java.net.*; import java.io.*; public class Inicio extends Applet implements ActionListener{ //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−VARIABLES GLOBALES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Frame ventana; Panel panelSur, panelMedio, panelNorte, panelCentro; Button botonAceptar, botonSalir, botonBuscar, botonBuscarEmpleado, botonNuevoEmpleado, botonAlta, botonVerDatos; Panel panelA, panelAs, panelC, panelS, panelS2, panelBsur, panelBusqueda, panelNuevo, panelResultado, panelLista, panelLsur; CardLayout cambioPanelCentro = new CardLayout(); CardLayout cambioPanelSur = new CardLayout(); Label etiquetaLogin, etiquetaPass, etiquetaTitulo, etiquetaCodigo, etiquetaNombre, etiquetaCargo, etiquetaPlanta, etiquetaDepartamento, etiquetaCDepartamento, etiquetaLista, etiquetaTodos; TextField textoLogin, textoPass, textoCodigo, textoNombre, textoCargo, textoPlanta, textoDepartamento, textoCDepartamento; MenuBar barraMenu; Menu menuGestion, menuSalir; MenuItem opcionAlta, opcionConsulta, opcionSalir; Socket conexion = null; 2 DataInputStream flujoEntradaFormato = null; DataOutputStream flujoSalidaDatos = null; Choice cajaCDepartamento; List listaEmpleados; int resultado; String[] choice; String[] datos; boolean conectado = false; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE VARIABLES GLOBALES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // CREAMOS UN OBJETO FRAME public void init() { ventana = new Frame("Aplicacion Gestion de Empleados"); this.metodoInicio(); } // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−CONSTRUIMOS LA VENTANA−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void metodoInicio() { this.construirVentana(); } public void construirVentana() { panelNorte = new Panel(); panelCentro = new Panel(); panelMedio = new Panel(); panelSur = new Panel(); this.crearComponentes(); this.construirPanelNorte(); 3 this.construirPanelMedio(); this.construirPanelSur(); this.construirMenu(); cambioPanelCentro.show( panelMedio, "id" ); cambioPanelSur.show( panelSur, "log" ); ventana.setLayout( new BorderLayout() ); ventana.add(panelNorte, "North"); ventana.add(panelMedio, "Center"); ventana.add(panelSur, "South"); ventana.setMenuBar(barraMenu); ventana.setSize(600,400); ventana.setVisible(true); ventana.setResizable(false); } public void construirMenu() { barraMenu = new MenuBar(); menuGestion = new Menu("Gestión"); menuSalir = new Menu("Salir"); opcionAlta = new MenuItem("Nuevo Empleado"); opcionConsulta = new MenuItem("Buscar Empleado"); opcionSalir = new MenuItem("Salir"); menuGestion.add(opcionAlta); menuGestion.add(opcionConsulta); menuSalir.add(opcionSalir); barraMenu.add(menuGestion); barraMenu.add(menuSalir); 4 opcionAlta.setEnabled(false); opcionConsulta.setEnabled(false); opcionAlta.addActionListener( this); opcionConsulta.addActionListener( this); opcionSalir.addActionListener( this); } public void construirPanelNorte() { etiquetaTitulo = new Label("GESTION DE EMPLEADOS"); etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) ); etiquetaTitulo.setAlignment (Label.CENTER); panelNorte.setLayout( new FlowLayout() ); panelNorte.add( etiquetaTitulo ); } public void construirPanelMedio() { Label etiquetaArroba = new Label("@"); etiquetaArroba.setFont ( new Font ("Verdana", Font.BOLD, 72) ); etiquetaArroba.setAlignment (Label.CENTER); panelC = new Panel(); botonSalir = new Button("Salir"); panelC.setLayout(new FlowLayout() ); panelC.add( botonSalir ); panelMedio.setLayout( cambioPanelCentro ); panelCentro.setLayout( new BorderLayout() ); panelCentro.setBackground(Color.yellow); panelCentro.add( etiquetaArroba, "Center"); panelCentro.add( panelC, "South" ); 5 panelMedio.add( panelCentro, "id" ); botonSalir.addActionListener( this); } public void construirPanelSur() { panelSur.setLayout( cambioPanelSur ); panelS = new Panel(); panelS.setLayout( new FlowLayout() ); etiquetaLogin = new Label("Login:"); etiquetaPass = new Label("Password:"); textoLogin = new TextField(); textoPass = new TextField(); textoLogin.setColumns(15); textoPass.setColumns(15); botonAceptar = new Button("Aceptar"); panelS.add(etiquetaLogin); panelS.add(textoLogin); panelS.add(etiquetaPass); panelS.add(textoPass); panelS.add(botonAceptar); panelSur.add( panelS, "log" ); botonAceptar.addActionListener( this); } public void construirPanelBusqueda() { panelBusqueda = new Panel(); panelBusqueda.setLayout( new BorderLayout() ); panelBsur = new Panel(); 6 botonBuscar = new Button("Buscar"); panelBsur.setLayout(new FlowLayout() ); panelBsur.add( botonBuscar ); Panel panelB = new Panel(); panelB.setLayout( new GridLayout(3,1) ); Panel panelB1 = new Panel(); panelB1.setLayout( new FlowLayout()); Panel panelB2 = new Panel(); panelB2.setLayout( new FlowLayout()); Panel panelBaux = new Panel(); panelBaux.setLayout( new FlowLayout()); panelBaux.add( etiquetaTodos ); panelB1.add( etiquetaCodigo ); panelB1.add( textoCodigo ); panelB2.add( etiquetaNombre ); panelB2.add( textoNombre ); panelB.add( panelBaux ); panelB.add( panelB1 ); panelB.add( panelB2 ); panelBusqueda.add( panelB, "Center" ); panelBusqueda.add( panelBsur, "South" ); panelMedio.add( panelBusqueda, "buscar" ); cambioPanelCentro.show( panelMedio, "buscar" ); etiquetaTitulo.setText("BÚSQUEDA DE EMPLEADOS"); etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) ); etiquetaTitulo.setAlignment (Label.CENTER); 7 botonBuscar.addActionListener( this); } public void construirPanelAlta() { panelA = new Panel(); panelA.setLayout( new BorderLayout() ); Panel panelAsur; panelAsur = new Panel(); panelAsur.setLayout(new FlowLayout() ); botonAlta = new Button("Dar de Alta"); panelAsur.add( botonAlta ); Panel panelA2 = new Panel(); panelA2.setLayout( new GridLayout(5,1) ); Panel panelA3 = new Panel(); panelA3.setLayout( new FlowLayout()); Panel panelA4 = new Panel(); panelA4.setLayout( new FlowLayout()); Panel panelA5 = new Panel(); panelA5.setLayout( new FlowLayout()); Panel panelA6 = new Panel(); panelA6.setLayout( new FlowLayout()); Panel panelA8 = new Panel(); panelA8.setLayout( new FlowLayout()); Panel panelAaux = new Panel(); panelAaux.setLayout( new FlowLayout()); panelA3.add( etiquetaCodigo ); panelA3.add( textoCodigo ); 8 panelA4.add( etiquetaNombre ); panelA4.add( textoNombre ); panelA5.add( etiquetaCargo ); panelA5.add( textoCargo ); panelA8.add( etiquetaCDepartamento ); panelA8.add( cajaCDepartamento ); panelA2.add( panelAaux ); panelA2.add( panelA3 ); panelA2.add( panelA4 ); panelA2.add( panelA5 ); panelA2.add( panelA8 ); panelA.add( panelA2, "Center" ); panelA.add( panelAsur, "South" ); panelMedio.add( panelA, "alta" ); cambioPanelCentro.show( panelMedio, "alta" ); etiquetaTitulo.setText("ALTA DE EMPLEADOS"); etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) ); etiquetaTitulo.setAlignment (Label.CENTER); botonAlta.addActionListener( this); } public void construirPanelDatos() { panelA = new Panel(); panelA.setLayout( new BorderLayout() ); Panel panelAsur; panelAsur = new Panel(); panelAsur.setLayout(new FlowLayout() ); 9 Panel panelA2 = new Panel(); panelA2.setLayout( new GridLayout(7,1) ); Panel panelA3 = new Panel(); panelA3.setLayout( new FlowLayout()); Panel panelA4 = new Panel(); panelA4.setLayout( new FlowLayout()); Panel panelA5 = new Panel(); panelA5.setLayout( new FlowLayout()); Panel panelA6 = new Panel(); panelA6.setLayout( new FlowLayout()); Panel panelA7 = new Panel(); panelA7.setLayout( new FlowLayout()); Panel panelA8 = new Panel(); panelA8.setLayout( new FlowLayout()); Panel panelAaux = new Panel(); panelAaux.setLayout( new FlowLayout()); panelA3.add( etiquetaCodigo ); panelA3.add( textoCodigo ); panelA4.add( etiquetaNombre ); panelA4.add( textoNombre ); panelA5.add( etiquetaCargo ); panelA5.add( textoCargo ); panelA6.add( etiquetaPlanta ); panelA6.add( textoPlanta ); panelA7.add( etiquetaDepartamento ); panelA7.add( textoDepartamento ); 10 panelA8.add( etiquetaCDepartamento ); panelA8.add( textoCDepartamento ); panelA2.add( panelAaux ); panelA2.add( panelA3 ); panelA2.add( panelA4 ); panelA2.add( panelA5 ); panelA2.add( panelA6 ); panelA2.add( panelA7 ); panelA2.add( panelA8 ); panelA.add( panelA2, "Center" ); panelA.add( panelAsur, "South" ); panelMedio.add( panelA, "alta" ); cambioPanelCentro.show( panelMedio, "alta" ); etiquetaTitulo.setText("RESULTADO"); etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) ); etiquetaTitulo.setAlignment (Label.CENTER); } public void construirPanelLista() { panelLista = new Panel(); panelLista.setLayout( new BorderLayout() ); panelLsur = new Panel(); botonVerDatos = new Button("Ver Datos"); panelLsur.setLayout(new FlowLayout() ); panelLsur.add( botonVerDatos ); Panel panelL = new Panel(); panelL.setLayout( new GridLayout(2,1) ); 11 Panel panelL1 = new Panel(); panelL1.setLayout( new FlowLayout()); Panel panelLaux = new Panel(); panelLaux.setLayout( new FlowLayout()); etiquetaLista = new Label("Seleccione un elemento de la lista"); panelL1.add( etiquetaLista ); panelL1.add( listaEmpleados ); panelL.add( panelLaux ); panelL.add( panelL1 ); panelLista.add( panelL, "Center" ); panelLista.add( panelLsur, "South" ); panelMedio.add( panelLista, "listar" ); cambioPanelCentro.show( panelMedio, "listar" ); etiquetaTitulo.setText("RESULTADO CONSULTA"); etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) ); etiquetaTitulo.setAlignment (Label.CENTER); botonVerDatos.addActionListener(this); listaEmpleados.addActionListener(this); } public void construirMenuInferior() { panelS2 = new Panel(); panelS2.setLayout( new FlowLayout() ); botonBuscarEmpleado = new Button("Buscar Empleado"); botonNuevoEmpleado = new Button("Nuevo Empleado"); panelS2.add(botonBuscarEmpleado); panelS2.add(botonNuevoEmpleado); 12 panelS2.add(botonSalir); panelSur.add( panelS2, "normal" ); cambioPanelSur.show( panelSur, "normal" ); botonBuscarEmpleado.addActionListener( this ); botonNuevoEmpleado.addActionListener( this ); this.EvaluarBotones("resultado"); } //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE CONSTRUIR LA VENTANA−−−−−−−−−−−−−−−−−−−−−−−−−− //−−−−−−−−−−−−−−−−−−−−−−−−EVALUAMOS LOS BOTONES PARA HABILITARLOS O DESHABILITARLOS−−−−−−−−−−−−− public void EvaluarBotones(String tipo) { if(tipo.equals("busqueda")){ textoCodigo.setEditable(true); textoNombre.setEditable(true); textoCargo.setEditable(true); textoPlanta.setEditable(true); textoDepartamento.setEditable(true); textoCDepartamento.setEditable(true); botonBuscarEmpleado.setEnabled(false); botonNuevoEmpleado.setEnabled(true); opcionAlta.setEnabled(true); opcionConsulta.setEnabled(false); }else if(tipo.equals("alta")){ textoCodigo.setEditable(true); textoNombre.setEditable(true); textoCargo.setEditable(true); 13 textoPlanta.setEditable(true); textoDepartamento.setEditable(true); textoCDepartamento.setEditable(true); botonNuevoEmpleado.setEnabled(false); botonBuscarEmpleado.setEnabled(true); opcionAlta.setEnabled(false); opcionConsulta.setEnabled(true); }else if(tipo.equals("resultado")){ textoCodigo.setEditable(false); textoNombre.setEditable(false); textoCargo.setEditable(false); textoPlanta.setEditable(false); textoDepartamento.setEditable(false); textoCDepartamento.setEditable(false); botonNuevoEmpleado.setEnabled(true); botonBuscarEmpleado.setEnabled(true); opcionAlta.setEnabled(true); opcionConsulta.setEnabled(true); } } //−−−−−−−−−−−−−−−−−FIN DE EVALUAMOS LOS BOTONES PARA HABILITARLOS O DESHABILITARLOS−−−−−−−−−−−−− //−−−−−−−−−−−−−−−−−−−−−−−CREAMOS (SOLO 1 VEZ) LOS COMPONENTES DE LA VENTANA−−−−−−−−−−−−−−−−−−−− public void crearComponentes(){ // CODIGO etiquetaCodigo = new Label("Código"); 14 textoCodigo = new TextField(); textoCodigo.setColumns(10); // NOMBRE etiquetaNombre = new Label("Nombre"); textoNombre = new TextField(); textoNombre.setColumns(35); // CARGO etiquetaCargo = new Label("Cargo"); textoCargo = new TextField(); textoCargo.setColumns(35); // CODIGO DEPARTAMENTO etiquetaCDepartamento = new Label("Código de Departamento"); textoCDepartamento = new TextField(); textoCDepartamento.setColumns(5); // DEPARTAMENTO etiquetaDepartamento = new Label("Departamento"); textoDepartamento = new TextField(); textoDepartamento.setColumns(35); // PLANTA etiquetaPlanta = new Label("Planta"); textoPlanta = new TextField(); textoPlanta.setColumns(5); // ETIQUETA TODOS etiquetaTodos = new Label("Para seleccionar todos los empleados, deje los campos en blanco"); } //−−−−−−−−−−−−−−−−−−−FIN DE CREAMOS (SOLO 1 VEZ) LOS COMPONENTES DE LA VENTANA−−−−−−−−−−−−−−−−−−−− 15 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−ESCUCHAMOS LOS EVENTOS DE LOS BOTONES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void actionPerformed( ActionEvent event ) { String etiqueta = event.getActionCommand(); if ( etiqueta.equals("Aceptar") ) this.Conectar(); if ( etiqueta.equals("Salir") ) this.Salir(); if ( etiqueta.equals("Nuevo Empleado") ) this.Alta(); if ( etiqueta.equals("Buscar Empleado") ) this.Buscar(); if ( etiqueta.equals("Buscar") ) this.DatosBuscar(); if ( etiqueta.equals("Dar de Alta") ) this.DatosAlta(); if ( etiqueta.equals("Ver Datos") ) this.MostrarEmpleado(); } //−−−−−−−−−−−−−−−−−−−−−−−−FIN DE ESCUCHAMOS LOS EVENTOS DE LOS BOTONES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //−−−−−−−−−−−−CONECTAMOS CON EL SERVIDOR EN LA DIRECCION "127.0.0.1" Y EN EL PUERTO "1234"−−−−−−−−−−−−−− public void realizarConexion() { String ipDestino = "127.0.0.1"; int puerto = 1234; InetAddress direccion = null; try { //InetAdress especifica el servidor al que nos queremos conectar direccion = InetAddress.getByName(ipDestino); } catch (UnknownHostException uhe) { System.err.println("Host no encontrado..." + uhe); DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Servidor no Encontrado", "Intentelo de nuevo más tarde", "Aceptar"); 16 dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } try { conexion = new Socket(direccion, puerto); //Creamos los flujos OutputStream flujoDatos = conexion.getOutputStream(); InputStream flujoEntrada = conexion.getInputStream(); //Recubrimos los flujos flujoSalidaDatos = new DataOutputStream(flujoDatos); flujoEntradaFormato = new DataInputStream(flujoEntrada); // Estamos conectados conectado = true; } catch (IOException io) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error de comunicaciones", "Servidor fuera de servicio", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al establecer la comunicación", "Vuelva a intentarlo más tarde", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); 17 dErrorUsuario.setVisible(true); } } //−−−−−−−−−FIN DE CONECTAMOS CON EL SERVIDOR EN LA DIRECCION "127.0.0.1" Y EN EL PUERTO "1234"−−−−−−−−−−−−−− //−−−−−−−−−−−−−−−−−−−−−−−−−TRATAMOS LOS BOTONES QUE PULSA EL USUARIO−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void Conectar() { if(conectado==false){ this.realizarConexion(); } if(conectado==true){ this.autenticarse(); if ( resultado == 1 ){ this.construirMenuInferior(); } else { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error de Autenticacion", "Revise los datos", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } } } public void Alta() { this.crearComponentes(); this.cargarChoice(); 18 this.construirPanelAlta(); this.EvaluarBotones("alta"); } public void Buscar() { this.crearComponentes(); this.construirPanelBusqueda(); this.EvaluarBotones("busqueda"); } public void DatosAlta() { this.enviarAlta(); if ( resultado==1 ){ this.enviarResultadoAlta(); this.construirPanelDatos(); this.EvaluarBotones("resultado"); } else if( resultado==0 ){ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "No puede dejar campos en blanco", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } else if( resultado==10 ){ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "Ya existe un empleado con ese código", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); 19 dErrorUsuario.setVisible(true); } else if( resultado==20 ){ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "El código debe ser de 5 caracteres", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } } public void DatosBuscar() { this.enviarConsulta(); if(resultado!=0){ this.construirPanelLista(); this.EvaluarBotones("resultado"); }else{ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Su consulta no obtuvo resultado", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } } public void MostrarEmpleado() { this.enviarEmpleadoConsulta(); if(resultado==1){ 20 this.construirPanelDatos(); this.EvaluarBotones("resultado"); }else if(resultado==10){ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Debe seleccionar un empelado", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); }else if(resultado==0){ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Su consulta no obtuvo resultado", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } } public void cargarChoice() { try { flujoSalidaDatos.writeInt(3); resultado = flujoEntradaFormato.readInt(); choice = new String[resultado]; if(resultado!=0){ for(int i = 0; i<resultado; i++){ choice[i] = flujoEntradaFormato.readUTF(); } 21 cajaCDepartamento = new Choice(); for(int a = 0; a<resultado; a++){ cajaCDepartamento.add(choice[a]); } } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void autenticarse() { try { datos = new String[2]; datos[0] = textoLogin.getText(); datos[1] = textoPass.getText(); for(int i=0; i<datos.length; i++){ if(datos[i].equals("")){ resultado = 0; } else { if(i==0){ flujoSalidaDatos.writeInt(1); } 22 flujoSalidaDatos.writeUTF(datos[i]); if(i==1){ resultado = flujoEntradaFormato.readInt(); } } } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void enviarConsulta() { try { flujoSalidaDatos.writeInt(2); flujoSalidaDatos.writeUTF(textoNombre.getText()); flujoSalidaDatos.writeUTF(textoCodigo.getText()); resultado = flujoEntradaFormato.readInt(); datos = new String[resultado]; if(resultado!=0){ for(int i = 0; i<resultado; i++){ datos[i] = flujoEntradaFormato.readUTF(); } 23 listaEmpleados = new List(5); for(int a = 0; a<resultado; a++){ listaEmpleados.add(datos[a]); } } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void enviarAlta() { try { if(textoCodigo.getText().equals("") || textoNombre.getText().equals("") || textoCargo.getText().equals("")){ resultado = 0; } else { if(textoCodigo.getText().length() != 5){ resultado = 20; } else { flujoSalidaDatos.writeInt(4); flujoSalidaDatos.writeUTF(textoCodigo.getText()); flujoSalidaDatos.writeUTF(textoNombre.getText()); flujoSalidaDatos.writeUTF(textoCargo.getText()); 24 flujoSalidaDatos.writeUTF(cajaCDepartamento.getSelectedItem()); resultado = flujoEntradaFormato.readInt(); } } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void enviarEmpleadoConsulta() { try { flujoSalidaDatos.writeInt(6); if(listaEmpleados.getSelectedIndex()==−1){ resultado = 10; } else { flujoSalidaDatos.writeUTF(listaEmpleados.getSelectedItem()); datos = new String[6]; for(int i=0; i<datos.length; i++){ datos[i] = flujoEntradaFormato.readUTF(); } resultado = flujoEntradaFormato.readInt(); if(resultado!=0){ 25 textoCodigo.setText(datos[0]); textoNombre.setText(datos[1]); textoCargo.setText(datos[2]); textoCDepartamento.setText(datos[3]); textoDepartamento.setText(datos[4]); textoPlanta.setText(datos[5]); } } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void enviarResultadoAlta() { try { flujoSalidaDatos.writeInt(5); flujoSalidaDatos.writeUTF(cajaCDepartamento.getSelectedItem()); datos = new String[3]; for(int i=0; i<datos.length; i++){ datos[i] = flujoEntradaFormato.readUTF(); } resultado = flujoEntradaFormato.readInt(); 26 if(resultado==1){ textoCDepartamento.setText(datos[0]); textoDepartamento.setText(datos[1]); textoPlanta.setText(datos[2]); textoCodigo.setText(textoCodigo.getText()); textoNombre.setText(textoNombre.getText()); textoCargo.setText(textoCargo.getText()); } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void Salir(){ try { if(conectado==false){ ventana.dispose(); }else{ flujoSalidaDatos.writeInt(7); ventana.dispose(); } } catch (Exception e) { 27 DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } //−−−−−−−−−−−−−−−−−−−−−FIN DE TRATAMOS LOS BOTONES QUE PULSA EL USUARIO−−−−−−−−−−−−−−−−−−−−−−−−−−−− //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE LA APLICACION CLIENTE−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− } DialogoInformativo.java import java.awt.*; import java.awt.event.*; public class DialogoInformativo extends Dialog implements ActionListener { String mensaje, etiqueta; public DialogoInformativo(Frame ventana, String titulo, String mensaje, String etiqueta) { super(ventana, titulo); this.mensaje = mensaje; this.etiqueta = etiqueta; this.construirDialogo(); } public void construirDialogo() { Label etiquetaMensaje = new Label(mensaje); Panel panelEtiqueta = new Panel(); 28 panelEtiqueta.setLayout( new FlowLayout() ); panelEtiqueta.add( etiquetaMensaje); Button boton = new Button(etiqueta); boton.addActionListener( this ); Panel panelBoton = new Panel(); panelBoton.setLayout( new FlowLayout() ); panelBoton.add( boton); this.setLayout( new GridLayout(2,1) ); this.add( panelEtiqueta ); this.add( panelBoton ); } public void actionPerformed(ActionEvent event ) { this.dispose(); } } Servidor.java import java.awt.*; import java.io.*; import java.net.*; import java.awt.event.*; import java.sql.*; import java.lang.*; public class Servidor extends Frame implements ActionListener { //Variables Globales Label etiquetaIP, etiquetaNClientes, etiquetaEstado, etiquetaContenido; TextField textoIP, textoNClientes, textoEstado; 29 TextArea txaContenido; Button botonApagar; public Servidor() { super("Servidor de Gestion de Empleados"); } public static void main(String args[] ) { Servidor obj = new Servidor(); obj.inicio(); } public void inicio() { etiquetaIP = new Label("Dirección IP local..."); textoIP = new TextField(30); textoIP.setEnabled(false); etiquetaNClientes = new Label("Nº de clientes autenticados..."); textoNClientes = new TextField(10); textoNClientes.setEnabled(false); etiquetaEstado = new Label("Estado de la comunicación..."); textoEstado = new TextField(20); textoEstado.setEnabled(false); etiquetaContenido = new Label("Datos recibidos del cliente..."); txaContenido = new TextArea(4,15); txaContenido.setEnabled(false); botonApagar = new Button("Apagar Servidor"); botonApagar.addActionListener(this); this.setLayout( new GridLayout(6,2) ); this.add(etiquetaIP); 30 this.add(textoIP); this.add(etiquetaNClientes); this.add(textoNClientes); this.add(etiquetaEstado); this.add(textoEstado); this.add(etiquetaContenido); this.add(txaContenido); this.add(botonApagar); this.pack(); this.setSize(400,400); this.setVisible(true); //Buscar y visualizar la dirección IP local donde se ejecuta este programa try { InetAddress servidor = InetAddress.getLocalHost(); String cadenaDireccion = servidor.toString(); textoIP.setText(cadenaDireccion); } catch (UnknownHostException uhe ) { System.err.println("No se ha podido saber la dirección local: " + uhe ); } //Abrimos el socket en el puerto 1234 ServerSocket conector = null; try { conector = new ServerSocket(1234); } catch (IOException io) { System.err.println("Se ha producido un error al abrir el Socket: " + io ); } 31 //Conexion a la base de datos Connection conexionBD=null; try { Class.forName("org.gjt.mm.mysql.Driver"); conexionBD = DriverManager.getConnection("jdbc:mysql://localhost/empleados?user=&password="); } catch (ClassNotFoundException e){ System.err.println("Clase no encontrada" + e); } catch (SQLException e) { System.err.println("Base de datos no encontrada" + e); } //Hilo int numeroClientes = 0; while(true) { try { textoEstado.setText("Esperando conexión con algún cliente..."); Socket conexion = conector.accept(); textoEstado.setText("La conexión se ha establecido con el cliente..."); numeroClientes ++; textoNClientes.setText("" + numeroClientes); //Creamos el hilo para un cliente Hilo h = new Hilo(conexion, conexionBD, txaContenido); h.start(); } catch (Exception e) { System.err.println("Se ha producido un error..."); } } 32 } public void actionPerformed (ActionEvent event) { String cadena = event.getActionCommand(); if(cadena.equals("Apagar Servidor")) System.exit(0); } } Hilo.java import java.awt.*; import java.net.*; import java.io.*; import java.sql.*; import java.lang.*; public class Hilo extends Thread { Socket conexion; TextArea txaContenido; Connection conexionBD; Statement envio = null; int protocolo = 0; int salida = 0; int i = 0; DataInputStream flujoEntradaDatos = null; DataOutputStream flujoSalidaFormato = null; String sql = ""; ResultSet resultado = null; ResultSet resultado_aux = null; boolean salir = true; 33 public Hilo ( Socket conexion, Connection conexionBD, TextArea txaContenido) { super(); this.conexion = conexion; this.txaContenido = txaContenido; this.conexionBD = conexionBD; } public void run() { try { //Creamos un flujo de entrada asociado al socket entre el cliente y el servidor InputStream flujoDatos = conexion.getInputStream(); // Creamos el envoltorio para el flujo flujoEntradaDatos = new DataInputStream( flujoDatos ); //Creamos un flujo de salida asociado al socket entre el cliente y el servidor OutputStream flujoSalida = conexion.getOutputStream(); // Creamos el envoltorio para el flujo flujoSalidaFormato = new DataOutputStream( flujoSalida ); } catch (Exception e) { System.err.println("Se ha producido un error" + e); } while (true) { try { envio = conexionBD.createStatement(); //Se lee el primer dato recibido para saber //lo que quiere hacer el cliente protocolo = flujoEntradaDatos.readInt(); switch(protocolo){ 34 case 1: // AUTENTICARSE //Leemos los dos parámetros que nos envía el cliente String login = flujoEntradaDatos.readUTF(); String password = flujoEntradaDatos.readUTF(); //Visualizamos lo que hemos recibido txaContenido.append("Login: " + login + "Pass: " + password+ "\n"); //Validamos en la BD sql = "SELECT * FROM usuarios WHERE login = '"+login+"' AND pass = '"+password+"'"; resultado = envio.executeQuery(sql); System.err.println(sql); //Si todo va bien, devolvemos un 1, //en caso contrario un 0 if (resultado.next()) { salida = 1; } else { salida = 0; } //Enviamos el resultado flujoSalidaFormato.writeInt(salida); envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 2: // CONSULTA 1 DATOS A LISTA String nombre = flujoEntradaDatos.readUTF(); String codigo = flujoEntradaDatos.readUTF(); //Validamos en la BD 35 sql = "SELECT nombre_empleado FROM empleado WHERE codigo_empleado like '%"+codigo+"%' AND nombre_empleado like '%"+nombre+"%'"; resultado = envio.executeQuery(sql); System.err.println(sql); i = 0; while(resultado.next()){ i++; } resultado = envio.executeQuery(sql); //Enviamos el resultado, el int es el numero de registros flujoSalidaFormato.writeInt(i); while(resultado.next()){ flujoSalidaFormato.writeUTF(resultado.getString(1)); } envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 3: // CARGAR CHOICE //Validamos en la BD sql = "SELECT nombre_dpto FROM departamento"; resultado = envio.executeQuery(sql); i = 0; while(resultado.next()){ i++; } resultado = envio.executeQuery(sql); //Enviamos el resultado un uno si no hay error 36 flujoSalidaFormato.writeInt(i); while(resultado.next()){ flujoSalidaFormato.writeUTF(resultado.getString(1)); } envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 4: //INSERTAR UN NUEVO EMPLEADO int alta; String cod_dep = ""; String[] campos = new String[4]; for(int c=0; c<campos.length; c++){ campos[c] = flujoEntradaDatos.readUTF(); } //Preguntamos si ya existe un empleado //con ese codigo sql = "SELECT * from empleado WHERE codigo_empleado = '"+campos[0]+"'"; resultado = envio.executeQuery(sql); if(resultado.next()){ //si ya existe... alta = 10; } else { //si no existe... // Realizamos el alta sql = "SELECT codigo_dpto FROM departamento WHERE nombre_dpto = '"+campos[3]+"'"; resultado = envio.executeQuery(sql); while(resultado.next()){ cod_dep = resultado.getString(1); 37 } sql = "INSERT INTO empleado (codigo_empleado, nombre_empleado, cargo_empleado, codigo_dpto) VALUES ('"+campos[0]+"', '"+campos[1]+"', '"+campos[2]+"', '"+cod_dep+"')"; System.err.println(sql); alta = envio.executeUpdate(sql); } flujoSalidaFormato.writeInt(alta); envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 5: //Consulta a departamento para mostrar //los datos de un alta String cod_depto = ""; String cod = flujoEntradaDatos.readUTF(); sql = "SELECT codigo_dpto FROM departamento WHERE nombre_dpto = '"+cod+"'"; System.err.println(sql); resultado = envio.executeQuery(sql); while(resultado.next()){ cod_depto = resultado.getString(1); } sql = "SELECT * FROM departamento WHERE codigo_dpto = '"+cod_depto+"'"; resultado = envio.executeQuery(sql); while(resultado.next()){ flujoSalidaFormato.writeUTF(resultado.getString(1)); flujoSalidaFormato.writeUTF(resultado.getString(2)); flujoSalidaFormato.writeUTF(resultado.getString(3)); } 38 flujoSalidaFormato.writeInt(1); envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 6: //RESULTADO CONSULTA FINAL String emp = flujoEntradaDatos.readUTF(); String departamento = ""; int p = 0; sql = "SELECT * FROM empleado WHERE nombre_empleado = '"+emp+"'"; resultado = envio.executeQuery(sql); System.err.println(sql); while(resultado.next()){ p++; flujoSalidaFormato.writeUTF(resultado.getString(1)); flujoSalidaFormato.writeUTF(resultado.getString(2)); flujoSalidaFormato.writeUTF(resultado.getString(3)); departamento = resultado.getString(4); flujoSalidaFormato.writeUTF(departamento); } if(p!=0){ sql = "SELECT nombre_dpto, planta_dpto FROM departamento WHERE codigo_dpto = '"+departamento+"'"; resultado = envio.executeQuery(sql); System.err.println(sql); while(resultado.next()){ flujoSalidaFormato.writeUTF(resultado.getString(1)); flujoSalidaFormato.writeUTF(resultado.getString(2)); 39 } } flujoSalidaFormato.writeInt(p); envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 7: //MATAR EL HILO System.err.println("Un cliente menos"); this.stop(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− }//fin del switch } catch (SQLException e) { System.err.println("Error de SQL..." + e); } catch (EOFException e) { System.err.println("Error de fin de fichero..." + e); } catch (Exception e) { System.err.println("Error al recibir o enviar datos en el hilo..."+e); } } } } Inicio.html <html> <head> <title></title> 40 </head> <body> <center><h1></h1></center> <applet code=Inicio.class width=0 height=0> Su Navegador no soporta applets en Java </applet> </body> </html> FUNCIONAMIENTO DE LA APLICACIÓN La aplicación para la gestión de empleados es una aplicación a tres capas clinete − servidor − base de datos. Para la base de datos he utilizado el servidor MySQL y la bse de datos queda reflejada al principio de este documento en el modelo de datos. El Cliente está desarrollado en un applet que abre un Frame, ahí es donde el usuario podrá interactuar con el sistema. Al estar integrado en un applet, el usuario posrá acceder vía web a la aplicación estando el applet en un servidor web (Personal Web Server en este caso). El applet es una clase llamada Inicio.class donde se crea un frame y se construyen todos los componentes de la ventana. Tras construir los componentes, la clase Inicio.class se queda esperando una acción del usuario en el método actionPerformed. Tras recibir dicha acción (pulsar algún botón) el applet, lo primero que hace es intentar conectarse con el servidor en la dirección IP en la que se encuantra corriendo y en el puerto 1234 que es el puerto por el que está escuchando peticiones de clientes. Si la conexión se realiza satisfactoriamente y se crea bien el socket de comunicaciones entre el Cliente y el Servidor, se crean los flujos de entrada y salida para los datos que intercambien el cliente y el servidor (DataOutputStream y DataInputStream). Cada posible petición del usuario la procesa un método en el applet y utiliza los flujos de entrada y salida para comunicarse con el servidor mediante un protocolo para que cada uno de ellos sepa que es lo que tiene que hacer en cada acción del usuario. El protocolo de comunicación entre el cliente y el servidor es el siguiente: Del cliente al servidor: • El cliente envía un 1 para solicitar que el servidor valide en la BD los datos de autenticación. • El cliente envía un 2 al servidor para realizar una primera consulta realizada por el usuario en la cual se cargará en otro formulario una lista con todos los nombre de empleados que cumplan los criterios de búsqueda seleccionados para que el usuario elija uno de ellos y ver así el detalle de su ficha. • El cliente envía un 3 para que el servidor pida a la BD los nombres de departamentos existentes y cargarlos en el choice de applet cuando el cliente quiere dar un alta. De este modo, el cliente solo podrá elegir entre los departamentos ya existentes a la hora de crear un nuevo empleado • El cliente envía un 4 cuando el usuario quiere dar de alta un nuevo empleado una vez rellenados todos 41 sus campos. • El cliente envía un 5 al servidor para que busque en la BD el registro correspondiente al departamento asociado al nuevo empelado que ha dado de alta el usuario. • El cliente envía un 6 cuando el usuario ha seleccionado un empleado concreto en la lista y quiere ver el detalle de su condulta. • El cliente envía un 7 al servidor cuando quiere cerrar la aplicación y de ese modo solicita la desconexión con el servidor matando el hilo. La clase Hilo.class generada por el servidor evalua en un while true (hasta que se desconecte el cliente) mediante un switch el número que le mande el cliente para tratar de forma correcta su petición. Del servidor al cliente: • El Servidor envía un 1 al cliente cuando su solicitud ha sido procesada con éxito. • El servidor envía un número distinto de 1 cuando se ha producido algún error en su solicitud. De esta forma, el cliente siempre sabe si su petición al servidor ha sido o no satisfactoria. Para informar al usuario de los posibles errores que se produzcan minetras ejecuta la aplicación, he creado una clase llamada DialogoInformativo.class que hereda de Frame y su cometido es crear una ventana auxiliar a la aplicación mostrando el texto que se le diga al crear un objeto de dicha clase en el constructor. El constructor de dicha clase recibe tres parámetros, Titulo de la ventana, Texto de la ventana y Texto del botón de la ventana. Esta clase se utiliza para advertir al usuario de posibles errores como que no debe dejar campos en blanco, que los datos introducidos son incorrectos, que se ha perdido la conexión con el servidor, .... La clse Servidor.class hereda de la clase Frame ya que abre una ventana para mostrar datos específicos acerca de la conexión de los distintos clientes que accedan a él. Tras construir los componentes de la ventana, abre un socket de comunicación en el puerto 1234 que es el puerto donde estará escuchando peticiones por parte de los clientes. Luego realiza la conexión con la base de datos de MySQL (DriverManager.getConnection). Tras realizar la conexión con la BD, ejecuta el método accept() de la clase Socket y se queda esperando la conexión de posibles clientes. Por cada cliente que entra por el accept(), el Servidor abre un hilo para que procese todas las peticiones del cliente, de esta forma la aplicación se convierte en mulhilo, es decir, puede atender a tantos clientes como entren. La clase Servidor.class finaliza cuando se pulsa sobre el botón de la pantalla de dicha clse Apagar Servidor. Para abrir el hilo, me he creado una case Hilo.class la cual recibe tres parámetros en su constructor cuando la invoca el Servidor. Estos parámetros son: El socket de comunicación con entre el cliente y el servidor ( para que sea el hilo quien continue la comunicación con el cliente), La conexión con la base de datos ( para que sea el hilo quien hable con la BD a la hora de hacer consultas, etc), y el tercer parámetro es un componente, es un textArea de la clase Servidor.class donde el hilo escribirá información pertinente al cliente que se ha conectado. La clase Hilo.class hereda de la clase Thread, por lo que estamos obligados a sobreescribir su método run(). En el método run() nos creamos, al igal en la clase Inicio.class, los flujos de entrada y salida de datos a través de los cuales se comunicarán el hilo y el applet (DataOutputStream y DataInputStream). Tras ello, nos metemos en un bucle infinito while(true) que mantendrá una conexión permanente con el cliente hasta que uno de los dos finalice la conexión. Dentro, nos creamos un Statement (envio = conexionBD.createStatement();) que ejecutará las peticiones a la base de datos de MySQL, y tras ello, recibimos mediante el flujo de entrada creado en el hilo, un entero que determinará el protocolo y por lo tanto la acción a realizar solicitada por el cliente, protocolo = flujoEntradaDatos.readInt(); esa variable la evaluamos en un switch y dependiendo de su valor ejecutamos una u ortra acción siguiendo el protocolo 42 descrito anteriormente en este documento (switch(protocolo)). FUENTES Inicio.java import java.awt.*; import java.applet.Applet; import java.awt.event.*; import java.net.*; import java.io.*; public class Inicio extends Applet implements ActionListener{ //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−VARIABLES GLOBALES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Frame ventana; Panel panelSur, panelMedio, panelNorte, panelCentro; Button botonAceptar, botonSalir, botonBuscar, botonBuscarEmpleado, botonNuevoEmpleado, botonAlta, botonVerDatos; Panel panelA, panelAs, panelC, panelS, panelS2, panelBsur, panelBusqueda, panelNuevo, panelResultado, panelLista, panelLsur; CardLayout cambioPanelCentro = new CardLayout(); CardLayout cambioPanelSur = new CardLayout(); Label etiquetaLogin, etiquetaPass, etiquetaTitulo, etiquetaCodigo, etiquetaNombre, etiquetaCargo, etiquetaPlanta, etiquetaDepartamento, etiquetaCDepartamento, etiquetaLista, etiquetaTodos; TextField textoLogin, textoPass, textoCodigo, textoNombre, textoCargo, textoPlanta, textoDepartamento, textoCDepartamento; MenuBar barraMenu; Menu menuGestion, menuSalir; MenuItem opcionAlta, opcionConsulta, opcionSalir; Socket conexion = null; DataInputStream flujoEntradaFormato = null; DataOutputStream flujoSalidaDatos = null; 43 Choice cajaCDepartamento; List listaEmpleados; int resultado; String[] choice; String[] datos; boolean conectado = false; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE VARIABLES GLOBALES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // CREAMOS UN OBJETO FRAME public void init() { ventana = new Frame("Aplicacion Gestion de Empleados"); this.metodoInicio(); } // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−CONSTRUIMOS LA VENTANA−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void metodoInicio() { this.construirVentana(); } public void construirVentana() { panelNorte = new Panel(); panelCentro = new Panel(); panelMedio = new Panel(); panelSur = new Panel(); this.crearComponentes(); this.construirPanelNorte(); this.construirPanelMedio(); this.construirPanelSur(); 44 this.construirMenu(); cambioPanelCentro.show( panelMedio, "id" ); cambioPanelSur.show( panelSur, "log" ); ventana.setLayout( new BorderLayout() ); ventana.add(panelNorte, "North"); ventana.add(panelMedio, "Center"); ventana.add(panelSur, "South"); ventana.setMenuBar(barraMenu); ventana.setSize(600,400); ventana.setVisible(true); ventana.setResizable(false); } public void construirMenu() { barraMenu = new MenuBar(); menuGestion = new Menu("Gestión"); menuSalir = new Menu("Salir"); opcionAlta = new MenuItem("Nuevo Empleado"); opcionConsulta = new MenuItem("Buscar Empleado"); opcionSalir = new MenuItem("Salir"); menuGestion.add(opcionAlta); menuGestion.add(opcionConsulta); menuSalir.add(opcionSalir); barraMenu.add(menuGestion); barraMenu.add(menuSalir); opcionAlta.setEnabled(false); opcionConsulta.setEnabled(false); 45 opcionAlta.addActionListener( this); opcionConsulta.addActionListener( this); opcionSalir.addActionListener( this); } public void construirPanelNorte() { etiquetaTitulo = new Label("GESTION DE EMPLEADOS"); etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) ); etiquetaTitulo.setAlignment (Label.CENTER); panelNorte.setLayout( new FlowLayout() ); panelNorte.add( etiquetaTitulo ); } public void construirPanelMedio() { Label etiquetaArroba = new Label("@"); etiquetaArroba.setFont ( new Font ("Verdana", Font.BOLD, 72) ); etiquetaArroba.setAlignment (Label.CENTER); panelC = new Panel(); botonSalir = new Button("Salir"); panelC.setLayout(new FlowLayout() ); panelC.add( botonSalir ); panelMedio.setLayout( cambioPanelCentro ); panelCentro.setLayout( new BorderLayout() ); panelCentro.setBackground(Color.yellow); panelCentro.add( etiquetaArroba, "Center"); panelCentro.add( panelC, "South" ); panelMedio.add( panelCentro, "id" ); botonSalir.addActionListener( this); 46 } public void construirPanelSur() { panelSur.setLayout( cambioPanelSur ); panelS = new Panel(); panelS.setLayout( new FlowLayout() ); etiquetaLogin = new Label("Login:"); etiquetaPass = new Label("Password:"); textoLogin = new TextField(); textoPass = new TextField(); textoLogin.setColumns(15); textoPass.setColumns(15); botonAceptar = new Button("Aceptar"); panelS.add(etiquetaLogin); panelS.add(textoLogin); panelS.add(etiquetaPass); panelS.add(textoPass); panelS.add(botonAceptar); panelSur.add( panelS, "log" ); botonAceptar.addActionListener( this); } public void construirPanelBusqueda() { panelBusqueda = new Panel(); panelBusqueda.setLayout( new BorderLayout() ); panelBsur = new Panel(); botonBuscar = new Button("Buscar"); panelBsur.setLayout(new FlowLayout() ); 47 panelBsur.add( botonBuscar ); Panel panelB = new Panel(); panelB.setLayout( new GridLayout(3,1) ); Panel panelB1 = new Panel(); panelB1.setLayout( new FlowLayout()); Panel panelB2 = new Panel(); panelB2.setLayout( new FlowLayout()); Panel panelBaux = new Panel(); panelBaux.setLayout( new FlowLayout()); panelBaux.add( etiquetaTodos ); panelB1.add( etiquetaCodigo ); panelB1.add( textoCodigo ); panelB2.add( etiquetaNombre ); panelB2.add( textoNombre ); panelB.add( panelBaux ); panelB.add( panelB1 ); panelB.add( panelB2 ); panelBusqueda.add( panelB, "Center" ); panelBusqueda.add( panelBsur, "South" ); panelMedio.add( panelBusqueda, "buscar" ); cambioPanelCentro.show( panelMedio, "buscar" ); etiquetaTitulo.setText("BÚSQUEDA DE EMPLEADOS"); etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) ); etiquetaTitulo.setAlignment (Label.CENTER); botonBuscar.addActionListener( this); } 48 public void construirPanelAlta() { panelA = new Panel(); panelA.setLayout( new BorderLayout() ); Panel panelAsur; panelAsur = new Panel(); panelAsur.setLayout(new FlowLayout() ); botonAlta = new Button("Dar de Alta"); panelAsur.add( botonAlta ); Panel panelA2 = new Panel(); panelA2.setLayout( new GridLayout(5,1) ); Panel panelA3 = new Panel(); panelA3.setLayout( new FlowLayout()); Panel panelA4 = new Panel(); panelA4.setLayout( new FlowLayout()); Panel panelA5 = new Panel(); panelA5.setLayout( new FlowLayout()); Panel panelA6 = new Panel(); panelA6.setLayout( new FlowLayout()); Panel panelA8 = new Panel(); panelA8.setLayout( new FlowLayout()); Panel panelAaux = new Panel(); panelAaux.setLayout( new FlowLayout()); panelA3.add( etiquetaCodigo ); panelA3.add( textoCodigo ); panelA4.add( etiquetaNombre ); panelA4.add( textoNombre ); 49 panelA5.add( etiquetaCargo ); panelA5.add( textoCargo ); panelA8.add( etiquetaCDepartamento ); panelA8.add( cajaCDepartamento ); panelA2.add( panelAaux ); panelA2.add( panelA3 ); panelA2.add( panelA4 ); panelA2.add( panelA5 ); panelA2.add( panelA8 ); panelA.add( panelA2, "Center" ); panelA.add( panelAsur, "South" ); panelMedio.add( panelA, "alta" ); cambioPanelCentro.show( panelMedio, "alta" ); etiquetaTitulo.setText("ALTA DE EMPLEADOS"); etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) ); etiquetaTitulo.setAlignment (Label.CENTER); botonAlta.addActionListener( this); } public void construirPanelDatos() { panelA = new Panel(); panelA.setLayout( new BorderLayout() ); Panel panelAsur; panelAsur = new Panel(); panelAsur.setLayout(new FlowLayout() ); Panel panelA2 = new Panel(); panelA2.setLayout( new GridLayout(7,1) ); 50 Panel panelA3 = new Panel(); panelA3.setLayout( new FlowLayout()); Panel panelA4 = new Panel(); panelA4.setLayout( new FlowLayout()); Panel panelA5 = new Panel(); panelA5.setLayout( new FlowLayout()); Panel panelA6 = new Panel(); panelA6.setLayout( new FlowLayout()); Panel panelA7 = new Panel(); panelA7.setLayout( new FlowLayout()); Panel panelA8 = new Panel(); panelA8.setLayout( new FlowLayout()); Panel panelAaux = new Panel(); panelAaux.setLayout( new FlowLayout()); panelA3.add( etiquetaCodigo ); panelA3.add( textoCodigo ); panelA4.add( etiquetaNombre ); panelA4.add( textoNombre ); panelA5.add( etiquetaCargo ); panelA5.add( textoCargo ); panelA6.add( etiquetaPlanta ); panelA6.add( textoPlanta ); panelA7.add( etiquetaDepartamento ); panelA7.add( textoDepartamento ); panelA8.add( etiquetaCDepartamento ); panelA8.add( textoCDepartamento ); 51 panelA2.add( panelAaux ); panelA2.add( panelA3 ); panelA2.add( panelA4 ); panelA2.add( panelA5 ); panelA2.add( panelA6 ); panelA2.add( panelA7 ); panelA2.add( panelA8 ); panelA.add( panelA2, "Center" ); panelA.add( panelAsur, "South" ); panelMedio.add( panelA, "alta" ); cambioPanelCentro.show( panelMedio, "alta" ); etiquetaTitulo.setText("RESULTADO"); etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) ); etiquetaTitulo.setAlignment (Label.CENTER); } public void construirPanelLista() { panelLista = new Panel(); panelLista.setLayout( new BorderLayout() ); panelLsur = new Panel(); botonVerDatos = new Button("Ver Datos"); panelLsur.setLayout(new FlowLayout() ); panelLsur.add( botonVerDatos ); Panel panelL = new Panel(); panelL.setLayout( new GridLayout(2,1) ); Panel panelL1 = new Panel(); panelL1.setLayout( new FlowLayout()); 52 Panel panelLaux = new Panel(); panelLaux.setLayout( new FlowLayout()); etiquetaLista = new Label("Seleccione un elemento de la lista"); panelL1.add( etiquetaLista ); panelL1.add( listaEmpleados ); panelL.add( panelLaux ); panelL.add( panelL1 ); panelLista.add( panelL, "Center" ); panelLista.add( panelLsur, "South" ); panelMedio.add( panelLista, "listar" ); cambioPanelCentro.show( panelMedio, "listar" ); etiquetaTitulo.setText("RESULTADO CONSULTA"); etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) ); etiquetaTitulo.setAlignment (Label.CENTER); botonVerDatos.addActionListener(this); listaEmpleados.addActionListener(this); } public void construirMenuInferior() { panelS2 = new Panel(); panelS2.setLayout( new FlowLayout() ); botonBuscarEmpleado = new Button("Buscar Empleado"); botonNuevoEmpleado = new Button("Nuevo Empleado"); panelS2.add(botonBuscarEmpleado); panelS2.add(botonNuevoEmpleado); panelS2.add(botonSalir); panelSur.add( panelS2, "normal" ); 53 cambioPanelSur.show( panelSur, "normal" ); botonBuscarEmpleado.addActionListener( this ); botonNuevoEmpleado.addActionListener( this ); this.EvaluarBotones("resultado"); } //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE CONSTRUIR LA VENTANA−−−−−−−−−−−−−−−−−−−−−−−−−− //−−−−−−−−−−−−−−−−−−−−−−−−EVALUAMOS LOS BOTONES PARA HABILITARLOS O DESHABILITARLOS−−−−−−−−−−−−− public void EvaluarBotones(String tipo) { if(tipo.equals("busqueda")){ textoCodigo.setEditable(true); textoNombre.setEditable(true); textoCargo.setEditable(true); textoPlanta.setEditable(true); textoDepartamento.setEditable(true); textoCDepartamento.setEditable(true); botonBuscarEmpleado.setEnabled(false); botonNuevoEmpleado.setEnabled(true); opcionAlta.setEnabled(true); opcionConsulta.setEnabled(false); }else if(tipo.equals("alta")){ textoCodigo.setEditable(true); textoNombre.setEditable(true); textoCargo.setEditable(true); textoPlanta.setEditable(true); textoDepartamento.setEditable(true); 54 textoCDepartamento.setEditable(true); botonNuevoEmpleado.setEnabled(false); botonBuscarEmpleado.setEnabled(true); opcionAlta.setEnabled(false); opcionConsulta.setEnabled(true); }else if(tipo.equals("resultado")){ textoCodigo.setEditable(false); textoNombre.setEditable(false); textoCargo.setEditable(false); textoPlanta.setEditable(false); textoDepartamento.setEditable(false); textoCDepartamento.setEditable(false); botonNuevoEmpleado.setEnabled(true); botonBuscarEmpleado.setEnabled(true); opcionAlta.setEnabled(true); opcionConsulta.setEnabled(true); } } //−−−−−−−−−−−−−−−−−FIN DE EVALUAMOS LOS BOTONES PARA HABILITARLOS O DESHABILITARLOS−−−−−−−−−−−−− //−−−−−−−−−−−−−−−−−−−−−−−CREAMOS (SOLO 1 VEZ) LOS COMPONENTES DE LA VENTANA−−−−−−−−−−−−−−−−−−−− public void crearComponentes(){ // CODIGO etiquetaCodigo = new Label("Código"); textoCodigo = new TextField(); textoCodigo.setColumns(10); 55 // NOMBRE etiquetaNombre = new Label("Nombre"); textoNombre = new TextField(); textoNombre.setColumns(35); // CARGO etiquetaCargo = new Label("Cargo"); textoCargo = new TextField(); textoCargo.setColumns(35); // CODIGO DEPARTAMENTO etiquetaCDepartamento = new Label("Código de Departamento"); textoCDepartamento = new TextField(); textoCDepartamento.setColumns(5); // DEPARTAMENTO etiquetaDepartamento = new Label("Departamento"); textoDepartamento = new TextField(); textoDepartamento.setColumns(35); // PLANTA etiquetaPlanta = new Label("Planta"); textoPlanta = new TextField(); textoPlanta.setColumns(5); // ETIQUETA TODOS etiquetaTodos = new Label("Para seleccionar todos los empleados, deje los campos en blanco"); } //−−−−−−−−−−−−−−−−−−−FIN DE CREAMOS (SOLO 1 VEZ) LOS COMPONENTES DE LA VENTANA−−−−−−−−−−−−−−−−−−−− //−−−−−−−−−−−−−−−−−−−−−−−−−−−−ESCUCHAMOS LOS EVENTOS DE LOS BOTONES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 56 public void actionPerformed( ActionEvent event ) { String etiqueta = event.getActionCommand(); if ( etiqueta.equals("Aceptar") ) this.Conectar(); if ( etiqueta.equals("Salir") ) this.Salir(); if ( etiqueta.equals("Nuevo Empleado") ) this.Alta(); if ( etiqueta.equals("Buscar Empleado") ) this.Buscar(); if ( etiqueta.equals("Buscar") ) this.DatosBuscar(); if ( etiqueta.equals("Dar de Alta") ) this.DatosAlta(); if ( etiqueta.equals("Ver Datos") ) this.MostrarEmpleado(); } //−−−−−−−−−−−−−−−−−−−−−−−−FIN DE ESCUCHAMOS LOS EVENTOS DE LOS BOTONES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //−−−−−−−−−−−−CONECTAMOS CON EL SERVIDOR EN LA DIRECCION "127.0.0.1" Y EN EL PUERTO "1234"−−−−−−−−−−−−−− public void realizarConexion() { String ipDestino = "127.0.0.1"; int puerto = 1234; InetAddress direccion = null; try { //InetAdress especifica el servidor al que nos queremos conectar direccion = InetAddress.getByName(ipDestino); } catch (UnknownHostException uhe) { System.err.println("Host no encontrado..." + uhe); DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Servidor no Encontrado", "Intentelo de nuevo más tarde", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); 57 dErrorUsuario.setVisible(true); } try { conexion = new Socket(direccion, puerto); //Creamos los flujos OutputStream flujoDatos = conexion.getOutputStream(); InputStream flujoEntrada = conexion.getInputStream(); //Recubrimos los flujos flujoSalidaDatos = new DataOutputStream(flujoDatos); flujoEntradaFormato = new DataInputStream(flujoEntrada); // Estamos conectados conectado = true; } catch (IOException io) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error de comunicaciones", "Servidor fuera de servicio", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al establecer la comunicación", "Vuelva a intentarlo más tarde", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } 58 } //−−−−−−−−−FIN DE CONECTAMOS CON EL SERVIDOR EN LA DIRECCION "127.0.0.1" Y EN EL PUERTO "1234"−−−−−−−−−−−−−− //−−−−−−−−−−−−−−−−−−−−−−−−−TRATAMOS LOS BOTONES QUE PULSA EL USUARIO−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void Conectar() { if(conectado==false){ this.realizarConexion(); } if(conectado==true){ this.autenticarse(); if ( resultado == 1 ){ this.construirMenuInferior(); } else { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error de Autenticacion", "Revise los datos", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } } } public void Alta() { this.crearComponentes(); this.cargarChoice(); this.construirPanelAlta(); this.EvaluarBotones("alta"); 59 } public void Buscar() { this.crearComponentes(); this.construirPanelBusqueda(); this.EvaluarBotones("busqueda"); } public void DatosAlta() { this.enviarAlta(); if ( resultado==1 ){ this.enviarResultadoAlta(); this.construirPanelDatos(); this.EvaluarBotones("resultado"); } else if( resultado==0 ){ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "No puede dejar campos en blanco", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } else if( resultado==10 ){ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "Ya existe un empleado con ese código", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } else if( resultado==20 ){ 60 DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "El código debe ser de 5 caracteres", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } } public void DatosBuscar() { this.enviarConsulta(); if(resultado!=0){ this.construirPanelLista(); this.EvaluarBotones("resultado"); }else{ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Su consulta no obtuvo resultado", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } } public void MostrarEmpleado() { this.enviarEmpleadoConsulta(); if(resultado==1){ this.construirPanelDatos(); this.EvaluarBotones("resultado"); 61 }else if(resultado==10){ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Debe seleccionar un empelado", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); }else if(resultado==0){ DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Su consulta no obtuvo resultado", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); } } public void cargarChoice() { try { flujoSalidaDatos.writeInt(3); resultado = flujoEntradaFormato.readInt(); choice = new String[resultado]; if(resultado!=0){ for(int i = 0; i<resultado; i++){ choice[i] = flujoEntradaFormato.readUTF(); } cajaCDepartamento = new Choice(); for(int a = 0; a<resultado; a++){ 62 cajaCDepartamento.add(choice[a]); } } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void autenticarse() { try { datos = new String[2]; datos[0] = textoLogin.getText(); datos[1] = textoPass.getText(); for(int i=0; i<datos.length; i++){ if(datos[i].equals("")){ resultado = 0; } else { if(i==0){ flujoSalidaDatos.writeInt(1); } flujoSalidaDatos.writeUTF(datos[i]); if(i==1){ 63 resultado = flujoEntradaFormato.readInt(); } } } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void enviarConsulta() { try { flujoSalidaDatos.writeInt(2); flujoSalidaDatos.writeUTF(textoNombre.getText()); flujoSalidaDatos.writeUTF(textoCodigo.getText()); resultado = flujoEntradaFormato.readInt(); datos = new String[resultado]; if(resultado!=0){ for(int i = 0; i<resultado; i++){ datos[i] = flujoEntradaFormato.readUTF(); } listaEmpleados = new List(5); for(int a = 0; a<resultado; a++){ 64 listaEmpleados.add(datos[a]); } } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void enviarAlta() { try { if(textoCodigo.getText().equals("") || textoNombre.getText().equals("") || textoCargo.getText().equals("")){ resultado = 0; } else { if(textoCodigo.getText().length() != 5){ resultado = 20; } else { flujoSalidaDatos.writeInt(4); flujoSalidaDatos.writeUTF(textoCodigo.getText()); flujoSalidaDatos.writeUTF(textoNombre.getText()); flujoSalidaDatos.writeUTF(textoCargo.getText()); flujoSalidaDatos.writeUTF(cajaCDepartamento.getSelectedItem()); resultado = flujoEntradaFormato.readInt(); 65 } } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void enviarEmpleadoConsulta() { try { flujoSalidaDatos.writeInt(6); if(listaEmpleados.getSelectedIndex()==−1){ resultado = 10; } else { flujoSalidaDatos.writeUTF(listaEmpleados.getSelectedItem()); datos = new String[6]; for(int i=0; i<datos.length; i++){ datos[i] = flujoEntradaFormato.readUTF(); } resultado = flujoEntradaFormato.readInt(); if(resultado!=0){ textoCodigo.setText(datos[0]); textoNombre.setText(datos[1]); 66 textoCargo.setText(datos[2]); textoCDepartamento.setText(datos[3]); textoDepartamento.setText(datos[4]); textoPlanta.setText(datos[5]); } } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void enviarResultadoAlta() { try { flujoSalidaDatos.writeInt(5); flujoSalidaDatos.writeUTF(cajaCDepartamento.getSelectedItem()); datos = new String[3]; for(int i=0; i<datos.length; i++){ datos[i] = flujoEntradaFormato.readUTF(); } resultado = flujoEntradaFormato.readInt(); if(resultado==1){ textoCDepartamento.setText(datos[0]); 67 textoDepartamento.setText(datos[1]); textoPlanta.setText(datos[2]); textoCodigo.setText(textoCodigo.getText()); textoNombre.setText(textoNombre.getText()); textoCargo.setText(textoCargo.getText()); } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } public void Salir(){ try { if(conectado==false){ ventana.dispose(); }else{ flujoSalidaDatos.writeInt(7); ventana.dispose(); } } catch (Exception e) { DialogoInformativo dErrorUsuario; dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse", 68 "Aceptar"); dErrorUsuario.setModal( true ); dErrorUsuario.setSize(200,150); dErrorUsuario.setVisible(true); ventana.dispose(); } } //−−−−−−−−−−−−−−−−−−−−−FIN DE TRATAMOS LOS BOTONES QUE PULSA EL USUARIO−−−−−−−−−−−−−−−−−−−−−−−−−−−− //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE LA APLICACION CLIENTE−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− } DialogoInformativo.java import java.awt.*; import java.awt.event.*; public class DialogoInformativo extends Dialog implements ActionListener { String mensaje, etiqueta; public DialogoInformativo(Frame ventana, String titulo, String mensaje, String etiqueta) { super(ventana, titulo); this.mensaje = mensaje; this.etiqueta = etiqueta; this.construirDialogo(); } public void construirDialogo() { Label etiquetaMensaje = new Label(mensaje); Panel panelEtiqueta = new Panel(); panelEtiqueta.setLayout( new FlowLayout() ); 69 panelEtiqueta.add( etiquetaMensaje); Button boton = new Button(etiqueta); boton.addActionListener( this ); Panel panelBoton = new Panel(); panelBoton.setLayout( new FlowLayout() ); panelBoton.add( boton); this.setLayout( new GridLayout(2,1) ); this.add( panelEtiqueta ); this.add( panelBoton ); } public void actionPerformed(ActionEvent event ) { this.dispose(); } } Servidor.java import java.awt.*; import java.io.*; import java.net.*; import java.awt.event.*; import java.sql.*; import java.lang.*; public class Servidor extends Frame implements ActionListener { //Variables Globales Label etiquetaIP, etiquetaNClientes, etiquetaEstado, etiquetaContenido; TextField textoIP, textoNClientes, textoEstado; TextArea txaContenido; 70 Button botonApagar; public Servidor() { super("Servidor de Gestion de Empleados"); } public static void main(String args[] ) { Servidor obj = new Servidor(); obj.inicio(); } public void inicio() { etiquetaIP = new Label("Dirección IP local..."); textoIP = new TextField(30); textoIP.setEnabled(false); etiquetaNClientes = new Label("Nº de clientes autenticados..."); textoNClientes = new TextField(10); textoNClientes.setEnabled(false); etiquetaEstado = new Label("Estado de la comunicación..."); textoEstado = new TextField(20); textoEstado.setEnabled(false); etiquetaContenido = new Label("Datos recibidos del cliente..."); txaContenido = new TextArea(4,15); txaContenido.setEnabled(false); botonApagar = new Button("Apagar Servidor"); botonApagar.addActionListener(this); this.setLayout( new GridLayout(6,2) ); this.add(etiquetaIP); this.add(textoIP); 71 this.add(etiquetaNClientes); this.add(textoNClientes); this.add(etiquetaEstado); this.add(textoEstado); this.add(etiquetaContenido); this.add(txaContenido); this.add(botonApagar); this.pack(); this.setSize(400,400); this.setVisible(true); //Buscar y visualizar la dirección IP local donde se ejecuta este programa try { InetAddress servidor = InetAddress.getLocalHost(); String cadenaDireccion = servidor.toString(); textoIP.setText(cadenaDireccion); } catch (UnknownHostException uhe ) { System.err.println("No se ha podido saber la dirección local: " + uhe ); } //Abrimos el socket en el puerto 1234 ServerSocket conector = null; try { conector = new ServerSocket(1234); } catch (IOException io) { System.err.println("Se ha producido un error al abrir el Socket: " + io ); } //Conexion a la base de datos 72 Connection conexionBD=null; try { Class.forName("org.gjt.mm.mysql.Driver"); conexionBD = DriverManager.getConnection("jdbc:mysql://localhost/empleados?user=&password="); } catch (ClassNotFoundException e){ System.err.println("Clase no encontrada" + e); } catch (SQLException e) { System.err.println("Base de datos no encontrada" + e); } //Hilo int numeroClientes = 0; while(true) { try { textoEstado.setText("Esperando conexión con algún cliente..."); Socket conexion = conector.accept(); textoEstado.setText("La conexión se ha establecido con el cliente..."); numeroClientes ++; textoNClientes.setText("" + numeroClientes); //Creamos el hilo para un cliente Hilo h = new Hilo(conexion, conexionBD, txaContenido); h.start(); } catch (Exception e) { System.err.println("Se ha producido un error..."); } } } 73 public void actionPerformed (ActionEvent event) { String cadena = event.getActionCommand(); if(cadena.equals("Apagar Servidor")) System.exit(0); } } Hilo.java import java.awt.*; import java.net.*; import java.io.*; import java.sql.*; import java.lang.*; public class Hilo extends Thread { Socket conexion; TextArea txaContenido; Connection conexionBD; Statement envio = null; int protocolo = 0; int salida = 0; int i = 0; DataInputStream flujoEntradaDatos = null; DataOutputStream flujoSalidaFormato = null; String sql = ""; ResultSet resultado = null; ResultSet resultado_aux = null; boolean salir = true; public Hilo ( Socket conexion, Connection conexionBD, TextArea txaContenido) { 74 super(); this.conexion = conexion; this.txaContenido = txaContenido; this.conexionBD = conexionBD; } public void run() { try { //Creamos un flujo de entrada asociado al socket entre el cliente y el servidor InputStream flujoDatos = conexion.getInputStream(); // Creamos el envoltorio para el flujo flujoEntradaDatos = new DataInputStream( flujoDatos ); //Creamos un flujo de salida asociado al socket entre el cliente y el servidor OutputStream flujoSalida = conexion.getOutputStream(); // Creamos el envoltorio para el flujo flujoSalidaFormato = new DataOutputStream( flujoSalida ); } catch (Exception e) { System.err.println("Se ha producido un error" + e); } while (true) { try { envio = conexionBD.createStatement(); //Se lee el primer dato recibido para saber //lo que quiere hacer el cliente protocolo = flujoEntradaDatos.readInt(); switch(protocolo){ case 1: // AUTENTICARSE 75 //Leemos los dos parámetros que nos envía el cliente String login = flujoEntradaDatos.readUTF(); String password = flujoEntradaDatos.readUTF(); //Visualizamos lo que hemos recibido txaContenido.append("Login: " + login + "Pass: " + password+ "\n"); //Validamos en la BD sql = "SELECT * FROM usuarios WHERE login = '"+login+"' AND pass = '"+password+"'"; resultado = envio.executeQuery(sql); System.err.println(sql); //Si todo va bien, devolvemos un 1, //en caso contrario un 0 if (resultado.next()) { salida = 1; } else { salida = 0; } //Enviamos el resultado flujoSalidaFormato.writeInt(salida); envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 2: // CONSULTA 1 DATOS A LISTA String nombre = flujoEntradaDatos.readUTF(); String codigo = flujoEntradaDatos.readUTF(); //Validamos en la BD sql = "SELECT nombre_empleado FROM empleado WHERE codigo_empleado like '%"+codigo+"%' AND nombre_empleado like '%"+nombre+"%'"; 76 resultado = envio.executeQuery(sql); System.err.println(sql); i = 0; while(resultado.next()){ i++; } resultado = envio.executeQuery(sql); //Enviamos el resultado, el int es el numero de registros flujoSalidaFormato.writeInt(i); while(resultado.next()){ flujoSalidaFormato.writeUTF(resultado.getString(1)); } envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 3: // CARGAR CHOICE //Validamos en la BD sql = "SELECT nombre_dpto FROM departamento"; resultado = envio.executeQuery(sql); i = 0; while(resultado.next()){ i++; } resultado = envio.executeQuery(sql); //Enviamos el resultado un uno si no hay error flujoSalidaFormato.writeInt(i); 77 while(resultado.next()){ flujoSalidaFormato.writeUTF(resultado.getString(1)); } envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 4: //INSERTAR UN NUEVO EMPLEADO int alta; String cod_dep = ""; String[] campos = new String[4]; for(int c=0; c<campos.length; c++){ campos[c] = flujoEntradaDatos.readUTF(); } //Preguntamos si ya existe un empleado //con ese codigo sql = "SELECT * from empleado WHERE codigo_empleado = '"+campos[0]+"'"; resultado = envio.executeQuery(sql); if(resultado.next()){ //si ya existe... alta = 10; } else { //si no existe... // Realizamos el alta sql = "SELECT codigo_dpto FROM departamento WHERE nombre_dpto = '"+campos[3]+"'"; resultado = envio.executeQuery(sql); while(resultado.next()){ cod_dep = resultado.getString(1); } 78 sql = "INSERT INTO empleado (codigo_empleado, nombre_empleado, cargo_empleado, codigo_dpto) VALUES ('"+campos[0]+"', '"+campos[1]+"', '"+campos[2]+"', '"+cod_dep+"')"; System.err.println(sql); alta = envio.executeUpdate(sql); } flujoSalidaFormato.writeInt(alta); envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 5: //Consulta a departamento para mostrar //los datos de un alta String cod_depto = ""; String cod = flujoEntradaDatos.readUTF(); sql = "SELECT codigo_dpto FROM departamento WHERE nombre_dpto = '"+cod+"'"; System.err.println(sql); resultado = envio.executeQuery(sql); while(resultado.next()){ cod_depto = resultado.getString(1); } sql = "SELECT * FROM departamento WHERE codigo_dpto = '"+cod_depto+"'"; resultado = envio.executeQuery(sql); while(resultado.next()){ flujoSalidaFormato.writeUTF(resultado.getString(1)); flujoSalidaFormato.writeUTF(resultado.getString(2)); flujoSalidaFormato.writeUTF(resultado.getString(3)); } flujoSalidaFormato.writeInt(1); 79 envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 6: //RESULTADO CONSULTA FINAL String emp = flujoEntradaDatos.readUTF(); String departamento = ""; int p = 0; sql = "SELECT * FROM empleado WHERE nombre_empleado = '"+emp+"'"; resultado = envio.executeQuery(sql); System.err.println(sql); while(resultado.next()){ p++; flujoSalidaFormato.writeUTF(resultado.getString(1)); flujoSalidaFormato.writeUTF(resultado.getString(2)); flujoSalidaFormato.writeUTF(resultado.getString(3)); departamento = resultado.getString(4); flujoSalidaFormato.writeUTF(departamento); } if(p!=0){ sql = "SELECT nombre_dpto, planta_dpto FROM departamento WHERE codigo_dpto = '"+departamento+"'"; resultado = envio.executeQuery(sql); System.err.println(sql); while(resultado.next()){ flujoSalidaFormato.writeUTF(resultado.getString(1)); flujoSalidaFormato.writeUTF(resultado.getString(2)); } 80 } flujoSalidaFormato.writeInt(p); envio.close(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− case 7: //MATAR EL HILO System.err.println("Un cliente menos"); this.stop(); break; //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− }//fin del switch } catch (SQLException e) { System.err.println("Error de SQL..." + e); } catch (EOFException e) { System.err.println("Error de fin de fichero..." + e); } catch (Exception e) { System.err.println("Error al recibir o enviar datos en el hilo..."+e); } } } } MANUAL DE USUARIO La aplicación para la gestión de empleados es una potente herramienta diseñada para que cualquier usuario sea capaz de utilizarla. En primer lugar, el usuario deberá autenticarse en el sistema mediante login y password 81 Solo los usuarios registrados podrán utilizar la aplicación. De manera que si un usuario introduce datos incorrectos el sistema no le permitirá conectarse con el servidor. En el caso de el usuario se autentifique satisfactoriamente entrará en la pantalla principal donde podrá elegir las acciones a realizar 82 En la pantalla principal, el usuario podrá realizar las distintas acciones pulsando tanto en los botones habilitados para ello como utilizando el menu ubicado en la barra de menús. Dichas acciones son dar de alta un nuevo empleado o consultar los datos de un empleado ya existente. Si el usuario selecicona dar de alta un empleado le aparecerá el siguinete formulario Para dar de alta a un nuevo empleado, el usuario debará introducir los datos del empleado y seleciconar uno de entre los posibles departamentos que se le ofrezca en la opción de código de departamento. Para que el alta se haga efectiva, no debe existir el código de empleado que seleccione el usuario y no se debe dejar ningún campo en blanco. Tras rellenar el formulario se pulsará sobre el botón Dar de Alta para confirmar los datos, apareciendo la siguiente pantalla. 83 Tras confirmar los datos, se le presentará al usuario la pantalla de la imagen anterior con todo el detalle del empleado que han insertado en la base de datos. Si el usuario selecicona la opción de buscar empleado, le aparecerá la siguiente pantalla para que introduzca los criterios de su búsqueda 84 La búsqueda se puede hacer mediante el código del empleado, mediante el nombre del empleado o mediante ambos. Si el usuario no sabe con exactitud el nombre o el código no importa, porque la aplicación buscará todos los empleados cuyo nombre o cuyo código contengan los caracteres que introduzca el usuario en los criterios de su búsqueda. Por ejemplo, si el usuario introduce en el campo nombre `ill' el resultado de su búsqueda serán todos los empleados cuyo nombre contenga la cadena `ill'. Para seleccionar todos los empleados disponibles, el usuario debará los dos campos en blanco y pulsar el botón Buscar. Tras pulsar el botón Buscar, se le mostrará al usuario una nueva pantalla con el siguiente formato: La pantalla contendrá una lista con los nombres de todos los empleados que coincidan con los criterios de búsqueda que ha introducido el usuario, pudiendose seleccionar uno de ellos para mostrar todo el detalle de sus datos dentro de la empresa. Tras pulsar en el botón Ver Datos aparecerá la siguiente pantalla 85 En ella se muestran todos los datos del empleado seleccionado en la pantalla anterior. El usuario podrá realizar todas estas operaciones las veces que crea oportuno, y para salir de ala aplicación tan solo tendrá que pulsar el botón Salir en cualquiera de las pantallas o en el menú de la barra de menús. Del lado del servidor, aparece la siguiente Interfaz gráfica con datos acerca del número de clientes conectados, el login y password del último cliente conectado, ... El servidor debe estar arrancado desde el principio para que el cliente pueda conectarse vía web. En el caso de que se cayera el sevidor mientras hay conectados clientes, le aparecerá un mensaje de error al cliente diciéndole que debe volver a conectarse porque se ha perdido la comunicación con el servidor. El interfaz del servidor es el siguiente 86 Para apager el srvidor, el administrador del sistema solo debará pulsar en el botón Apagar Servidor. Y este es el funcionamiento de la herramienta para la Gestión de Empleados. MODELO DE DATOS La base de datos empleados está formada por tres tablas: empleado, usuarios y departamentos. • La tabla ususarios es independiente de las otras dos y se utiliza para verificar que un usuasrio está registrado a la hora de conectarse al servidor y contiene dos campos: login(PK) y pass 87 • La tabla empelado contiene la información correspondiente a los empleados de la empresa y tiene una relación n − 1 con la tabla departamentos. Sus campos son: codigo_empleado (PK), nombre_empleado, cargo_empleado y codigo_dpto(SK). 88 • La tabla departamentos contiene la información correspondiente la ubicación de cada uno de los departamentos de la empresa y tiene una relación 1 − n con la tabla empleado. Sus campos son: codigo_dpto(PK), nombre_dpto y planta_dpto. 89 90 91 92 Inicio.html <html> <head> <title></title> </head> <body> <center><h1></h1></center> <applet code=Inicio.class width=0 height=0> Su Navegador no soporta applets en Java </applet> </body> </html> 93