Sistemas Operacionais 2007/2 Trabalho 2 Servidor Remoto para Venda de Passagens Aéreas Grupo 9 Leone Mendonça de Sena • Patrícia Lima de Souza e Silva • Peter Peret Lupo • Rafael Azevedo de Faria • Ramon de Aguiar Campos • Funcionalidades Foi implementado um servidor remoto para venda de passagens aéreas que atende clientes através de uma rede TCP/IP. Os vôos domésticos são feitos pelo Boeing 737, ligando: Rio a São Paulo (100 assentos); Rio a Salvador (50 assentos); Rio a Belo Horizonte (30 assentos); Rio a Brasília (100 assentos); Rio a Manaus (20 assentos). O projeto É feito totalmente em Java e tem interface gráfica tanto para o cliente quanto para o servidor. Foi utilizado o Subversion pra controle de versão concorrente, permitindo que os membros do grupo pudessem trabalhar distribuídos geograficamente e de forma assíncrona. Tem um site onde podem ser acessados os downloads, as distribuições, o código versionado, um Wiki, um sistema de bug tracking e a página principal, contendo a especificação do trabalho e melhorias futuras. O projeto Módulo Servidor Módulo Cliente Módulo Servidor Deve permitir leituras concorrentes para uma mesma aeronave. A reserva é um artifício para permitir ao cliente pensar antes de efetuar a compra. Uma reserva cai automaticamente após um tempo pré-fixado de 15s. Os assentos são distribuídos automaticamente (o cliente não escolhe). A compra requer reserva prévia. É política da empresa adotar um overbook de até 10% da lotação da aeronave Módulo Servidor No pacote br.ufrj.dcc.sistemasoperacionais.passagensaereas.servidor.controle: A classe Servidor permanece escutando a porta 5000 e a solicitação recebida de cada cliente que acessa o servidor é executada por uma thread distinta. Os clientes têm suas funcionalidades atendidas no servidor pela implementação da classe ServicoPassagensServidor. Módulo Cliente Ao abrir o programa Cliente, o mesmo reconhece o próprio IP, sugerindo pra fazer a conexão. Se não reconhecer, o IP é inicializado com o valor 127.0.0.1 Módulo Cliente Ao lado, um diagrama que ilustra como o programa cliente pode ser executado. Módulo Cliente Funções da classe Collection<Trecho> obtemTrechos() Retorna um array contendo todos os trechos disponíveis int obtemVagasNoTrecho(int trecho) A partir do trecho desejado, retorna o número de vagas disponíveis no mesmo. boolean reservaTrecho(int numeroAssentos, int trecho) Retorna verdadeiro se a quantidade de assentos no trecho for reservada com sucesso, e falso, caso contrário. A reserva pode falhar quando o número de assentos disponiveis, mesmo com overbooking, é insuficiente para atender o pedido de reserva. boolean compraTrecho(int numeroAssentos, int trecho) Retorna verdadeiro se a quantidade de assentos no trecho for comprada com sucesso, e falso, caso contrário. int consultaReserva(int trecho) A partir do trecho desejado, retorna a quantidade de reservas realizadas no mesmo. int consultaCompras(int trecho) A partir do trecho desejado, retorna a quantidade de compras realizadas no mesmo. int obtemTotalCompras() A partir do trecho desejado, retorna o total de compras realizado no mesmo. int obtemTotalReservas() Retorna o total de reservas realizadas em todos os trechos. Sincronização Foram utilizadas duas estratégias: Métodos synchronized na classe ServicoPassagensServidor impedem que duas threads estejam no método ao mesmo tempo; Um semáforo binário para cada trecho, controlando o acesso para alterações em cada um deles. Métodos bloqueiaTrecho e desbloqueiaTrecho da classe Trecho do pacote br.ufrj.dcc.sistemasoperacionais.passagensaereas.servidor.controle Comunicação entre os módulos Cliente e Servidor A classe Comunicacao do pacote br.ufrj.dcc.sistemasoperacionais.passagensaereas.comunicacao é responsável por traduzir os protocolos das mensagens entre os módulos para as operações desejadas. static Protocolo getProtocolo (int comando) { switch (comando) { case 1: return OBTEM_TRECHOS; case 4: return COMPRA_TRECHO; case 3: return RESERVA_TRECHO; case 5: return CONSULTA_RESERVA; case 6: return CONSULTA_COMPRAS; case 2: return OBTEM_VAGAS_NO_TRECHO; case 7: return CONSULTA_TOTAL_RESERVAS; case 8: return CONSULTA_TOTAL_COMPRAS; default: return OBTEM_TRECHOS; } Observações Toda vez que é efetuado um pedido de uma reserva de um trecho, o programa atualiza a informação de reservas desse trecho. Da mesma forma, toda vez que é realizada a compra de um trecho, o programa atualiza a informação de compras desse trecho. Sugestões para trabalhos futuros em cima do mesmo tema Documentar o código com Javadoc. Gerar diagramas UML (pelo menos classe e seqüência). Remodelar o MVC fazendo com que a interface seja observadora dos trechos para refletir as mudanças no modelo. Implementar a persistência utilizando JPA e Hibernate. Mostrar automaticamente os reflexos das mudanças do servidor em todos os clientes. Unificar as classes "Trecho" do cliente e do servidor em uma classe Trecho apenas e fazer as instâncias desta classe serem enviadas pela rede ao invés de strings. Implementar a internacionalização dos textos da interface usando o mecanismo de Resource Bundle do Java. Rever o tratamento de exceções. Há lugares onde deveriam ser lançadas e são "tratadas" e vice-versa. Implementar no cliente uma área de mensages de erro/sucesso das operações solicitadas. Implementar na interface do servidor uma área de mensages das ações solicitadas pelos clientes com os resultados (como um log). Acrescentar na interface do cliente as compras efetuadas em cada trecho e as reservas efetuadas em cada trecho. Implementar um mecanismo de log no cliente e no servidor utilizando Log4J. Implementar testes automatizados com JUnit.