Reserva de places d’avió (2)¶
Amb la mateixa idea de l’exercici practiques/concurrencia/reservesAvio/index dissenyar un sistema de reserves d’avió per una xarxa de computadors seguint el model de client-servidor. En les agències de viatge tindran un computador amb el programa agència (client) que s’haurà de connectar amb un programa servidor reserves que gestiona i manté la base de dades de l’avió. En el computador on està la base de dades, hi haurà també un altre programa servidor consulta_reserves que serveix una pàgina html mostrant tots els seients de l’avió amb el seu estat lliure o ocupat. En el cas d’estar ocupat es posa qui l’ocupa (nom o identificador de viatger).
La següent figura mostra un esquema del sistema:
Els programes reserves i consulta_reserves són els que tindran accés directe a la base de dades de l’avió. Tots els programes poden estar en el mateix computador o en computadors diferents. Per tant, la comunicació entre programes es farà via connector (socket) del mòdul socket. El servidor reserves haurà de mantenir la comunicació simultània de diverses agències. Es recomana que useu un fil de control (threads) per cada connexió. Aquests fils de control tindran ptotecció de zona crítica «modificar-si-lliure» per actualizar la base de dades.
El protocol de comunicació seria via missatges entre agència i reserves consistirà en missatges com:
Petició client |
Resposta servidor |
|---|---|
«files» |
«NFILES» |
«estat seient IDSEIENT» |
«seient IDSEIENT lliure» o «seient IDSEIENT ocupat» o «seient IDSEIENT inexistent» |
«modifica seient IDSEIENT VIATGER» |
«seient IDSEIENT modificat» o «seient IDSEIENT no modificat» (cas en que ja estigués prèviament ocupat) |
On NFILES és el nombre de files de 6 seients que té l’avió obert per reserves, IDSEIENT és l’identificador del seient; per exemple: 1A, 10B, 20H; i VIATGER és el nom del viatger que ocupa el seient.
El programa consulta_reserves tindrà accés directe a la base de dades i es comunicarà en qualsevol navegador amb el protocol html. Utilitzeu un entorn de treball per aplicacions web (web framework), flask
La instal·lació de flask en debian/ubuntu:
sudo apt install python3-flask
Trobareu les pàgines que serveix flask en el vostre computador posant en el navegador l’adreça https://localhost:5000.
Paràmetres de línia¶
agència¶
El programa agència haurà de tenir com a paràmetres el nom de l’agència, l’adreça d’internet o el nom DNS de la màquina on està la base de dades de l’avió i el programa reserves, i el nom d’un fitxer de clients.
Per exemple:
$ agència BonViatge 192.168.1.103 clients1_300.txt
Per generació de fitxers de clients, veure notes.
reserves¶
El programa reserves té un paràmetre de línia: el nom de la base de dades de l’avió, i el nombre de files que té. Per exemple:
$ reserves Boeing714 30
consulta_reserves¶
El programa consulta_reserves té un paràmetre de línia: el nom de la base de dades de l’avió. Per exemple:
$ consulta_reserves Boeing714
Ajudes per les proves¶
L’execució del programa agència la podeu fer de diverses formes:
Cada agència en màquines fisíques i/o virtuals diferents
Cada agència en terminals diferents d’una mateixa màquina o en màquines diferents.
En un mateix terminal.
En aquest darrer cas, molt útil per fer proves en desenvolupament, podeu desenvolupar alguns guions de bash que us facilitin la feina.
Per exemple, per executar simultàniament 3 agències:
$ agència BonViatge1 192.168.1.103 clients1_300.txt & $ agència BonViatge2 192.168.1.103 clients301_600.txt & $ agència BonViatge3 192.168.1.103 clients601_900.txt
On es suposa que hi ha creats els fitxers clients*.txt que surten com a paràmetres.
Per executar-ne moltes més es pot fer un guió com aquest:
#!/bin/bash
export PATH=$PATH":."
Nagencies=10
Servidor=192.168.1.101
Avio=Boeing714
for ((i=1; $i<=$Nagencies ; i++))
do
comanda=$comanda" agència age$i $Servidor clientsAge$i.txt & "
done
comanda=$comanda" reserves $Avio & consulta_reserves $Avio"
echo $comanda
bash -c "$comanda"
que el podeu a la seva vegada parametritzar, fent:
...
Nagencies=$1
Servidor=$2
Avio=$3
...
En aquest darrer cas, les agencies s’anomenen age1, age2, … , i tenen fitxers clients clientAge1.txt, clientAge2.txt, …
Comprovació de funcionament¶
Per comprovar el funcionament de l’aplicació, cal que el programa agència generi allà on sigui, un fitxer registre<nom agència>.csv que contingui els clients que han pogut reservar plaça a l’avió. Per exemple,si el nom de l’agència és BonViatge el fitxer s’anomenarà registreBonViatge.csv. Cada línia del fitxer contindrà nom client i plaça reservada separats per coma. Per exemple, Pere,3F.
Un cop executat el sistema de reserves, es recullen els diversos fitxers generats i es posen en el directori on està la base de dades de l’avió tractat. Teniu a la vostra disposició la comanda scp que ve amb la instal·lació de open-ssh i permet fer còpies de fitxers entre computadors connectats a xarxa. Per exemple, per copiar un fitxer que està en el vostre directori de treball a una màquina remota remot.alli.xarxa o 192.168.1.100 en la que teniu un compte a nom de pepe, seria:
$ scp fitxer.ext pepe@remot.alli.xarxa:
o també:
$ scp fitxer.ext pepe@192.168.1.100:
Un cop executada el fitxer estarà en el directori que per omissió es té al entrar com a usuari pepe en la màquina remot.
Recollits tots els fitxers de registre d’agència, executeu el programa comprova.py. Paràmetres de línia són el nom de l’avió, i el directori des de on es troben els registres (fa cerca recursiva de l’arbre de directoris de registre*.csv):
$ python3 comprova.py Boeing714 .
Recordeu que el . és el directori de treball.
Notes
En internet es troben moltes pàgines introductòries del llenguatge/protocol html. Per exemple, en https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML, i https://fresno.pntic.mec.es/~bfof0000/curs1213/HTML_introduccio.pdf.
Per crear fitxers de clients, podeu fer servir el programa
genclients.py. Té com a paràmetres de línia, el nom del fitxer de clients a crear, el primer client, i quants clients cal generar. Exemple d’ús:$ python3 genclients.py clients1.txt 100 300
crearà un fitxer que començarà pel client 0100 fins arribar al 0399