Anda di halaman 1dari 24

Benemrita Universidad Autnoma de Puebla

Materia:

Programacin Distribuida.
Catedrtica:

M.C. Maria del Carmen Ceron Garnica


Proyecto:

*Simulacin Terminal de camiones * Venta y Recepcin de Boletos


Presenta:

Camela Reyes Armando Cruz Espinal Gabriel Garca Crquela Natanael Maratinez Martinez Claudio Norberto Nieves Ziga Eleazar Ingeniera en Ciencias de la Computacin Facultad de Ciencias de la Computacin.

Heroica puebla de Zaragoza, puebla a Julio del 2007

INDICE CAPITULO 1: INTRODUCCION Y OBJETIVOS 1.1 Introduccin...3 1.2 Objetivos 1.21 Objetivo general...4 1.22 Objetivo especifico...5 CAPITULO 2: DESARROLLO 2.1Desarrollo terico 2.11Interfaz...7 2.12 Diseo de clases..10 2.13 Relaciones11 2.2Desarrollo practico 2.21 Cdigo de la aplicacin Ticket Bus Servidor...15 2.22 Cdigo Fuente de la aplicacin Ticket Bus Estacin de trabajo.....................19 2.23Cdigo Fuente de la aplicacin Ticket Bus Cliente...22 2.24 Interfaz final..25 CAPITULO 3: Anexos Conclusiones.27 Bibliografa...28

**** CAPITULO 1 **** Introduccin El sistema que se desarrollara surgi como un proyecto a corto plazo para la materia de Programacin Concurrente y tiene como finalidad la creacin de un sistema en el lenguaje de programacin JAVA que maneje una Terminal de autobuses. Este sistema pretende que cualquier usuario pueda manejarlo por lo que tiene que ser sencillo, y gozar de una buena interfase. En el apartado de objetivos se har mencin de los logros que se pretende conseguir con la realizacin de dicho sistema. Objetivo general Se persigue primordialmente el fin de realizar un software de Terminal de autobuses que sea manejable para cualquier usuario, sin importar edad, sexo o status social y que tenga el cometido de permitir que el usuario consulte de entre una base de datos un destino deseado, en esa consulta debe aparecer el precio del boleto y el sistema debe de ser capaz de venderlo, adems de permitir que el usuario escoja un asiento.

Objetivos especficos Nuestro sistema tiene como objetivos especficos los siguientes: El sistema debe manejar 10 destinos distintos, especificados por un color. El sistema debe manejar 4 salas de espera y mandar a los usuarios a ella antes de abordar el camin de su destino. Los usuarios que aborden un camin desaparecern de la sala de espera y sus lugares en ella sern reasignados a nuevos usuarios. Un usuario ira a la sala de espera que segn se indique en su destino como sur, norte, este u oeste. El sistema debe gozar de una interfase sencilla y practica para evitar que algn usuario se desespere por su funcionamiento. El sistema debe ser capaz de permitir la venta de boletos a usuarios y evitar que dos usuarios quieran acceder a la misma informacin a la vez para evitar un traslape de lugares en el autobs o una posible sobrecarga de boletos.

**** CAPITULO 2 **** Primera Interfaz propuesta En la figura numero 1 se muestra la interfaz principal del sistema que consta de informacin sobre la disponibilidad de cupo en las salas que se dividieron en 4, una para los destinos del sur (Tabasco y Oaxaca), otra para los destinos del norte (Monterrey, Guadalajara y Tijuana), otra para los destinos del este (Veracruz y Tlaxcala) y finalmente una para los destinos del oeste (Guerrero y Colima). Cada destino fue marcado con un color de la manera siguiente:

As, se ubicaran los lugares en la sala de forma aleatoria y segn el color se sabr el destino al que pertenece. Posteriormente existen dos opciones, la de consulta y la de Comprar boleto, si se da clic en consulta aparece del lado derecho una ventana de informacin en donde el usuario elegir de la lista el destino a elegir, a continuacin aparecer informacin como las horas de salida de los camiones y el precio del boleto, junto con una pequea imagen del destino.

La figura 1 se muestra a continuacin:

Ahora, si el usuario se decide y quiere comprar su boleto usara la opcin de comprar boleto que despliega una nueva ventana que se muestra en la figura 2. En esta nueva ventana el usuario elegir el destino al que desea ir y se mostrara el precio del boleto, junto con los lugares disponibles en el autobs. Si el usuario se decide podr ver que lugares de los que estn disponibles, para ello se maneja una pequea imagen que simula los asientos del autobs y que utiliza dos smbolos para indicar si el asiento esta disponible u ocupado, estos signos son:

Si el asiento escogido esta marcado de verde no podr usarlo, pero si esta marcado de rojo si podr usarlo. Si cambia de opinin o tuvo algn error y no quiere viajar simplemente da la opcin cancelar. La figura numero 2 es la siguiente:

Relacin usuario boleto.

Relacin usuario cliente.

Relacin usuario autobs.

Relaciones.

Usuarios = Cliente

1 Cliente =1 Boleto = 1 Autobs

1 Boleto = 1 Asiento = 1 Autobs

Cdigo Fuente de la aplicacin Ticket Bus Servidor import java.awt.*; import java.net.*; import java.sql.*; import java.io.*; import java.awt.event.*; import java.util.Vector; public class tbServer extends Frame{ ServerSocket s; //el socket de la conexion int clientes; // cantidad de clientes concectados int lugares[]; //lugares reservados TextArea entrada; //area de escritura de mensajes Connection cntn; //Manejador para ODBC (conexion con acces) Statement stmt; //Para maejar las consultas ResultSet rslt; //tabla de resultados tbServer(){ //************DECLARACIONES PARA LA BASE DE DATOS *************** try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //para ocupar los ODBC de la maquina cntn = DriverManager.getConnection("jdbc:odbc:BaseDatos"); //para accesar a la base de datos stmt = cntn.createStatement(); //para crear una interfaz con la BD } catch (Exception e) {}; //************DECLARACIONES PARA EL FRAME SERVIDOR ************** lugares=new int[5]; //un arreglo de 5 lugares setTitle("Servidor de TicketBus"); //titulo de la ventana setBackground(Color.blue); //color del fondo (no se ve...) setSize(550,350); //tamao del frame entrada=new TextArea(20,40); //area de texto entrada.setEditable(false); //no se puede modificar add(entrada); addWindowListener(new Cerrar()); //para cuando se cierra la ventana setVisible(true); clientes=0; } class Cerrar extends WindowAdapter{ public void windowClosing(WindowEvent e){ try{stmt.close(); //cierra el statement cntn.close();} //cierra la conexion con ODBC catch (Exception ex) {};

dispose(); System.exit(0); } }

public void aadir(String texto){ entrada.append(texto); } void lanzarServidor(){ String cadena; try{ s=new ServerSocket(5000,50); //crea el socket servidor en puerto 5000, con un maximo de 50 clientes while(true){ new NuevoCliente(s.accept(),this,clientes++).start(); //acepta las peticiones de conexion } } catch(IOException e) {}; } void reservar(String destino,String hora,String nombre,int cantidadA){ //para cuando deseo reservar un lugar String inst="Insert into Autobus values ('"+nombre+"','"+destino+"','"+hora+"','"+cantidadA+"')"; //instruccion SQL para aadir a la BD los datos que le mando try{ stmt.executeUpdate(inst); //ejecuto la inserccion en la BD aadir("Se han reservado "+cantidadA+" lugares mas\n"); //escribe un mensaje en el servidor } catch(Exception e) {}; } boolean consultar(String destino,String hora,int cantidadA){ //para saber si hay o no lugares disponibles int suma=0; try{ aadir("Realizando Consulta...\n"); rslt = stmt.executeQuery("SELECT * FROM Autobus where Ruta like '"+destino+"' and Hora like '"+hora+"'"); //instruccion SQL para consultar en BD los registros para un autobus determinado aadir("consulta terminada, hay a la fecha: "); while (rslt.next()){ //mientras haya mas registros de respuesta int temp=rslt.getInt("CantidadAR"); //obtiene la cantidad de

asientos reservados para cada uno suma=suma+temp; //y los suma } //aadir(Integer.toString(suma)+" lugares apartados\n"); if ((suma+cantidadA)<45){ //si aun hay lugares disponibles return true; //regresa verdadero } else return false; // o falso de lo contrario } catch (Exception e) {aadir("ERROR! CONSULTA INVALIDA!\n");}; return false; }

String buscar(String nombre){ //para saber si alguien ya ha reservado Vector aux=new Vector(); try{ rslt = stmt.executeQuery("SELECT * FROM Autobus WHERE Nombre LIKE '"+nombre+"'"); //consulta SQL en base al nombre while(rslt.next()){ //mientras haya registros que coincidan String ayuda=rslt.getString("Ruta")+" "+rslt.getString("Hora")+" "+rslt.getString("CantidadAR")+""; //obtiene los datos de cada regitro y los guarda en una cadena aadir(ayuda+"\n"); aux.addElement(ayuda); //la cadena la aade a un vector } }catch (Exception e) {}; return aux.toString(); //regrea el vector en forma de cadena } public static void main(String args[]){ tbServer Servidor=new tbServer(); Servidor.lanzarServidor(); } } class NuevoCliente extends Thread{ Socket conexion; tbServer serv; int cliente; DataInputStream entrada; //flujo de entrada de datos DataOutput salida; //flujo de salida de datos NuevoCliente(Socket c,tbServer s,int numero){ conexion=c; serv=s;

cliente=numero; try{ entrada=new DataInputStream(conexion.getInputStream()); salida=new DataOutputStream(conexion.getOutputStream()); } catch (IOException e) {}; } public void run(){ boolean Salir=false; while(!Salir){ //mientras no de la instruccion salir en la terminal try{ String destino=entrada.readUTF(); //lee una cadena en teoria, la ruta de viaje if (destino.equals("Salir")) //si el texto es el de salir, termina la ejecucion Salir=true;

else{ if (destino.equals("Terminal")||destino.equals("Station")) //si dice Terminal o Station, lo conecta y se prepara para lo que sigue serv.aadir("Conectando "+destino+"\n"); else{ if (destino.charAt(0)=='>') //si el texto comienza con > (es de la telefonista) { destino=destino.substring(1); //borra del destino el caracter > String hora=entrada.readUTF(); //lee la hora String nombre=entrada.readUTF(); //lee el nombre del registro int casientos=Integer.parseInt(entrada.readUTF()); //lee la cantidad de asientos que desean reservar serv.aadir("Intentando reservar un pasaje "+destino+" "+hora+"\n"); if(serv.consultar(destino,hora,casientos)){ //si aun hay asientos salida.writeUTF("Reservacion completada "); //dice que ya reservo serv.reservar(destino,hora,nombre,casientos); //reserva

} else salida.writeUTF("No hay Lugares Disponibles"); //si no, dice que ya no hay lugares } else{ //si el texto no comienza con > String datos=serv.buscar(destino); //busca los datos de los que reservaron a ese nombre salida.writeUTF(datos); //los envia a la station } } } } catch (IOException e) {}; } serv.aadir("La terminal ha sido desconectada\n"); try{ conexion.close(); //cierra la conexion } catch (IOException e) {}; } }

Cdigo Fuente de la aplicacin Ticket Bus Estacin de trabajo import java.awt.*; import java.net.*; import java.io.*; import java.util.StringTokenizer; import java.awt.event.*; class tbStation extends Frame implements ActionListener{ Socket conexion; DataOutputStream salida; DataInputStream entrada; Panel panel; Button consulta,conectar,desconectar; TextArea estado; TextField nombre,casientos,opcionViaje,opcionHora; tbStation(){ super("TicketBus Estacin Central"); //titulo de la ventana

// setBackground(Color.LIGHT_GRAY); //colores setBackground(Color.black); //colores setForeground(Color.red); setSize(300,460); panel=new Panel(); nombre=new TextField(25); estado=new TextArea(15,35); nombre.setEnabled(true); estado.setEnabled(false); consulta=new Button("Consultar"); consulta.setEnabled(false); conectar=new Button("Conectar"); desconectar=new Button("Desconectar"); desconectar.setEnabled(false); panel.add(new Label(" CONSULTA DE RESERVACION ")); panel.add(new Label("NOMBRE DE REGISTO: ")); panel.add(nombre); panel.add(consulta); panel.add(estado); panel.add(new Label("OPCIONES DE CONEXION")); panel.add(conectar); panel.add(desconectar); consulta.addActionListener(this); //escucha para el boton consulta conectar.addActionListener(this); //escucha para el boton conectar desconectar.addActionListener(this); // " " " " desconectar addWindowListener(new Cerrar()); add(panel); setVisible(true); }

public void actionPerformed(ActionEvent e){ String com=e.getActionCommand(); if(com.equals("Consultar")){ //si el boton presionado es el de Consultar try { salida.writeUTF(nombre.getText()); //escribe en el servidor el nombre String datos=entrada.readUTF(); //lee los registros que le manda el servidor (un vector en forma de cadena) StringTokenizer cad=new StringTokenizer(datos,"[],"); //lo separa en base a los caracteres del vector y un caracter predefinido while (cad.hasMoreTokens()){ //mientras haya tokens estado.append(cad.nextToken()+"\n"); //los escribe

} nombre.setText(""); //borra el nombre consultado } catch(IOException excepcion) {}; } else if (com.equals("Conectar")){ //si el boton es el de conectar try{ conexion=new Socket(InetAddress.getLocalHost(),5000); //obtiene el servidor salida=new DataOutputStream(conexion.getOutputStream()); //crea las conexiones entrada=new DataInputStream(conexion.getInputStream()); salida.writeUTF("Station"); //escribe en el servidor Station para identificarlo conectar.setEnabled(false); //cambia las propiedades de los botones consulta.setEnabled(true); desconectar.setEnabled(true); } catch (IOException excepcion) {}; } else try{ salida.writeUTF("Salir"); //si no, (es el de salir) conexion.close(); //cierra la conexion conectar.setEnabled(true); //cambia las propiedades de los botones desconectar.setEnabled(false); conectar.setEnabled(false); } catch(IOException excepcion) {}; } class Cerrar extends WindowAdapter{ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } } public static void main(String args[]){ new tbStation(); } } Cdigo Fuente de la aplicacin Ticket Bus Cliente import java.awt.*; import java.net.*; import java.io.*; import java.awt.event.*; class tbClient extends Frame implements ActionListener{

Socket conexion; Choice opcionViaje, opcionHora; DataOutputStream salida; //buffer de salida DataInputStream entrada; //buffer de entrada Panel panel; Button reservar,conectar,desconectar; TextField estado,nombre, casientos; tbClient(){ //creacion de la ventana (para mas datos, chacar las otras clases) super("TicketBus Telephonical Center"); setBackground(new Color (255,182,123)); setForeground(Color.black); setSize(220,350); panel=new Panel(); nombre=new TextField(25); estado=new TextField(25); casientos=new TextField(10); nombre.setEnabled(true); estado.setEnabled(false); opcionViaje=new Choice(); opcionHora=new Choice(); opcionViaje.add("Puebla -> Veracruz"); opcionViaje.add("Puebla -> Mexico"); opcionViaje.add("Puebla -> Tlaxcala"); opcionViaje.add("Puebla -> Oaxaca"); opcionViaje.add("Puebla -> Hidalgo"); opcionViaje.setEnabled(false); opcionHora.add("7:00 hrs"); opcionHora.add("9:00 hrs"); opcionHora.add("11:00 hrs"); opcionHora.add("13:00 hrs"); opcionHora.add("15:00 hrs"); opcionHora.add("17:00 hrs"); opcionHora.add("19:00 hrs"); opcionHora.setEnabled(false); reservar=new Button("Reservar"); reservar.setEnabled(false); conectar=new Button("Conectar"); desconectar=new Button("Desconectar"); desconectar.setEnabled(false); panel.add(new Label("RUTA DE VIAJE")); panel.add(opcionViaje); panel.add(opcionHora); panel.add(new Label("NOMBRE DE REGISTRO: ")); panel.add(nombre); panel.add(new Label("CANTIDAD DE ASIENTOS: ")); panel.add(casientos); panel.add(reservar);

panel.add(new Label("OPCIONES DE CONEXION")); panel.add(conectar); panel.add(desconectar); panel.add(estado); reservar.addActionListener(this); conectar.addActionListener(this); desconectar.addActionListener(this); addWindowListener(new Cerrar()); add(panel); setVisible(true); } public void actionPerformed(ActionEvent e){ String com=e.getActionCommand(); if(com.equals("Reservar")){ //si se presiona el boton reservar try { salida.writeUTF(">"+opcionViaje.getItem(opcionViaje.getSelectedIndex())); //escribe en el servidor la ruta del viaje con un > al principio salida.writeUTF(opcionHora.getItem(opcionHora.getSelectedIndex())); //escribe la hora salida.writeUTF(nombre.getText()); //escribe al servidor el nombre salida.writeUTF(casientos.getText()); //escribe la antidad de asientos String lugares=entrada.readUTF(); //lee la descricion de si hay o no lugares disponibles estado.setEnabled(true); estado.setText(lugares); estado.setEnabled(false); } catch(IOException excepcion) {}; } else if (com.equals("Conectar")){ //si presionan el boton Conectar try{ conexion=new Socket(InetAddress.getLocalHost(),5000); //crea el socket y busca la conexion con el servidor local salida=new DataOutputStream(conexion.getOutputStream()); //abre los flujos de entrada/salida entrada=new DataInputStream(conexion.getInputStream()); salida.writeUTF("Terminal"); //escribe al servidor Terminal para identificarse conectar.setEnabled(false);//cambia las propiedades de los botones desconectar.setEnabled(true); reservar.setEnabled(true); opcionViaje.setEnabled(true);

opcionHora.setEnabled(true); } catch (IOException excepcion) {}; } else try{ salida.writeUTF("Salir"); //para salir, cerrar la conexion, etc... conexion.close(); conectar.setEnabled(true); desconectar.setEnabled(false); reservar.setEnabled(false); opcionViaje.setEnabled(false); opcionHora.setEnabled(false); } catch(IOException excepcion) {}; } class Cerrar extends WindowAdapter{ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } } public static void main(String args[]){ new tbClient(); } }

Interfaz final Interfaces de las aplicaciones antes mencionadas. Interfaz cliente Interfaz Estacin Interfaz Servidor

**** CAPITULO 3 **** Anexos Conclusiones Con lo abordado en el presente trabajo se puede decir que el analizar el problema antes de llevarlo a la practica es sumamente importancia, pues gracias a ello se pudo contemplar las posibles soluciones a los problemas que podramos tener mas adelante y ahorrarnos muchos pasos innecesarios a la hora de la codificacin, al principio fue mas tardado pero nos ayudo mucho. Aprendimos el uso de los threads y reafirmamos conocimientos adquiridos tanto en el curso como en otros cursos. Desarrollar un sistema de Terminal de autobuses no fue una tarea sencilla y conforme se iba avanzando surgan mas preguntas y queramos buscar maneras de solucionarlas, pero se acomplejaba el sistema. En fin, podemos concluir que se lograron los objetivos planeados en un inicio y nuestro sistema cubri las expectativas del grupo. Bibliografa Java Para Estudiantes Bell, Doug, 1944Mxico, D.F. : Pearson Education, c2003. Programacin Multithread En Java Lewis, Bil. Madrid : Pearson Education , 2003. Estructuras De Datos Y Algoritmos En Java/B Michael Goodrich, Roberto Tamassia. Goodrich, Michael T. Mexico : CECSA, c2002. Teach Yourself Java 1.1 Programming In 24 Hours. Cadenhead, Rogers. Mxico: Prentice-Hall Hispanoamericana, 1998.

Anda mungkin juga menyukai