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.
Download

Trabalho2_Apresentacao