Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Gestion d'un système client-serveur. Ven 17 Mai 2024 - 14:02 | |
| Oui - faute de frappe. J'ai corrigé le ";": - Code:
-
' test_GestionEleves_Serveur.bas ' ' Ce programme est juste une démo d'un système client/serveur. ' Il prend pour exemple une gestion des élèves d'une école. ' Le serveur gère un fichier des élèves, accédé par des enseignants qui sont les clients. ' Le serveur gère aussi un fichier des enseignants avec leur identification et mot de passe. ' ' Le programme fonctionne à l'aide des fonctions de gestion des boites mail type 2 de KGF.dll. ' le serveur ne peut être lancé qu'en un seul exemplaire sur sa machine. ' Il crée une boite email nommée "GestionEleves_Serveur". ' Tous les clients utilisent cette boite mail pour envoyer des requêtes au serveur. ' ' Chaque client est lancé lui aussi en un seul exemplaire sur sa machine, différente du serveur. ' On nomme client le programme lancé par un enseignant pour communiquer avec le serveur. ' Chaque client crée sa propre boite mail dont le nom inclut l'identification de l'enseignant. ' Ainsi, les boites mail des enseignants sont uniques, eles aussi. ' Elles servent à recevoir les réponses du serveur pour les requêtes des clients. ' ' L'enseignant lance son programme client et entre son identification et son mot de passe. ' Le programme client détermine le nom de la boite mail et vérifie si elle n'est pas déjà active. ' Le client envoir alors une requête LOGIN au serveur, de la façon suivante: ' LOGIN,idEnseignant,MotDePasseEnseignant,BoiteMailEnseignant ' Le MotDePasseEnseignant est crypté par la fonction Crypt64, et le serveur ne le décrypte pas. ' Le serveur reçoit cette requète dans sa boite mail. Il vérifie alors sans sa liste des ' connexions actives si cet enseignant est déjà connecté. Si oui, il refuse avec le message ' FAILED ' Sinon, il vérifie dans la liste des enseignants si l'identifiant et le mot de passe sont corrects. ' Si oui, il ajoute l'enseignant dans la liste des connextions actives et confirme avec le message ' OK ' Sinon, il refuse avec le message ' FAILED ' ' L'enseignant termine sa session apr une requête LOGOUT du format suivant: ' LOGOUT,idEnseignant ' Le serveur enlève alors l'enseignant de la liste des enseignants connectés (grid 1003) ' en n'acepte plus aucune requête de sa part. ' ' LE serveur comprend une fonction d'enregistrement des enseignants autorisés. Il mémorise ces données ' dans un fichier GestionEleves_Enseignants.dat, dans lesuel un trouven pour chaque enseignant: ' Nom ' Prénom ' ID ' Mot de passe (crypté par la fonction Crypt64)
labels() constantes() variables() GUI() verification() fichiers() end
sub labels() label close0, close2100 label NouvelEnseignant, SupprimerEnseignant, SelectEnseignant label pwdsecret, ValiderEnseignant, CreerEnseignant, ClickTab, label ModifierEnseignant, RemplacerEnseignant label TimerEvent end_sub
sub constantes() dim KGFdll$ : KGFdll$ = "KGF.dll" dim FichierEnseignants$ : FichierEnseignants$ = "GestionEleves_Enseignants.dat" dim EnteteEnseignants$ : EnteteEnseignants$ = "Gestion des Elèves - Enseignants" dim mailbox_serveur$ : mailbox_serveur$ = "\\.\mailslot\GestionEleves_Serveur" dim MaxEnseignants% : MaxEnseignants% = 100 dll_on KGFdll$ dim MachineServeur$ : MachineServeur$ = string$(255," ") dim res% res% = dll_call1("ComputerName",adr(MachineServeur$)) MachineServeur$ = trim$(MachineServeur$) dim titre$ : titre$ = "Gestion des élèvers - Serveur ("+MachineServeur$+")" end_sub
sub variables() dim s$, i%, j%, p% dim mbx_serveur%, pwdSecret%, nom$, prenom$, id$, pwd$, GridSelected% dim serveurActif%, ModeOperation%, maxsiz%, nxtsiz%, cnt%, tmo% dim NombreRequetesAcceptees%, NombreRequetesRejetees%, nActifs% end_sub
sub GUI() full_space 0 : on_close 0,close0 caption 0,titre$ container_tab 1 : full_space 1 tab 1000 : parent 1000,1 : caption 1000,"Connexions" : on_show 1000,ClickTab tab 2000 : parent 2000,1 : caption 2000,"Enseignants" : on_show 2000,ClickTab tab 3000 : parent 3000,1 : caption 3000,"Statistiques" : on_show 3000,ClickTab GUI_invisibles() GUI_Connexions() GUI_Enseignants() GUI_Statistiques() end_sub
sub GUI_invisibles() dlist 98 memo 99 : hide 99 : bar_both 99 : ' ce mémo sert à recevoir une requête d'un client timer 90 : timer_off 90 : timer_interval 90,500 : on_timer 90,TimerEvent end_sub
sub GUI_Connexions() alpha 1001 : parent 1001,1000 : top 1001,20 : left 1001,100 : font_bold 1001 font_size 1001,24 : caption 1001,"Le serveur est démarré..." alpha 1002 : parent 1002,1000 : top 1002,60 : left 1002,100 : font_bold 1001 grid 1003 : parent 1003,1000 : top 1003,90 width 1003,856 : height 1003,height_client(0)-150 grid_column_fixed 1003,1 grid_row_fixed 1003,1 grid_row 1003,MaxEnseignants% + 1 grid_column 1003,6 grid_one_column_width 1003,1,30 grid_one_column_width 1003,2,200 grid_one_column_width 1003,3,200 grid_one_column_width 1003,4,100 grid_one_column_width 1003,5,1 grid_one_column_width 1003,6,300 for i%=1 to MaxEnseignants% grid_write 1003,i%+1,1,str$(i%) next i% grid_write 1003,1,1,"#" grid_write 1003,1,2,"Nom" grid_write 1003,1,3,"Prénom" grid_write 1003,1,4,"ID" grid_write 1003,1,5,"Boite mail" grid_write 1003,1,6,"Pwd" end_sub
sub GUI_Enseignants() grid 2001 : parent 2001,2000 on_click 2001,SelectEnseignant width 2001,856 : height 2001,height_client(0)-60 grid_column_fixed 2001,1 grid_row_fixed 2001,1 grid_row 2001,MaxEnseignants% + 1 grid_column 2001,6 grid_one_column_width 2001,1,30 grid_one_column_width 2001,2,200 grid_one_column_width 2001,3,200 grid_one_column_width 2001,4,100 grid_one_column_width 2001,5,1 grid_one_column_width 2001,6,300 for i%=1 to MaxEnseignants% grid_write 2001,i%+1,1,str$(i%) next i% grid_write 2001,1,1,"#" grid_write 2001,1,2,"Nom" grid_write 2001,1,3,"Prénom" grid_write 2001,1,4,"ID" grid_write 2001,1,5,"Boite mail" grid_write 2001,1,6,"Pwd" button 2010 : parent 2010,2000 : top 2010,10 : left 2010,width(2001)+20 : width 2010,100 caption 2010,"Nouveau" : on_click 2010,NouvelEnseignant button 2011 : parent 2011,2000 : top 2011,top(2010)+height(2010) : left 2011,width(2001)+20 : width 2011,100 caption 2011,"Supprimer" : on_click 2011,SupprimerEnseignant button 2012 : parent 2012,2000 : top 2012,top(2011)+height(2011) : left 2012,width(2001)+20 : width 2012,100 caption 2012,"Modifier" : on_click 2012,ModifierEnseignant form 2100 : hide 2100 : : on_close 2100,close2100 : caption 2100,"Création d'un nouvel enseignant" width 2100,800 : height 2100,500 top 2100,(height_client(0)-500)/2 : left 2100,(width_client(0)-800)/2 alpha 2101 : parent 2101,2100 : top 2101,20 : left 2101,20 : caption 2101,"Nom:" alpha 2102 : parent 2102,2100 : top 2102,50 : left 2102,20 : caption 2102,"Prénom:" alpha 2103 : parent 2103,2100 : top 2103,80 : left 2103,20 : caption 2103,"ID:" alpha 2104 : parent 2104,2100 : top 2104,110 : left 2104,20 : caption 2104,"Mot de passe:" edit 2111 : parent 2111,2100 : top 2111,20 : left 2111,120 : width 2111,600 edit 2112 : parent 2112,2100 : top 2112,50 : left 2112,120 : width 2112,600 edit 2113 : parent 2113,2100 : top 2113,80 : left 2113,120 : width 2113,200 edit 2114 : parent 2114,2100 : top 2114,110 : left 2114,120 : width 2114,200 secret_on 2114 button 2120 : parent 2120,2100 : top 2120,top(2114) : left 2120,left(2114)+width(2114) caption 2120,"Voir" : on_click 2120,pwdsecret button 2028 : parent 2028,2100 : top 2028,380 : left 2028,20 : width 2028,300 caption 2028,"Valider" : font_bold 2028 : on_click 2028,ValiderEnseignant button 2029 : parent 2029,2100 : top 2029,380 : left 2029,left(2028)+width(2028)+30 : width 2029,300 caption 2029,"Annuler" : on_click 2029,Close2100 end_sub
sub GUI_Statistiques() alpha 3001 : parent 3001,3000 : top 3001,100 : left 3001,100 : font_bold 3001 font_size 3001,24 : caption 3001,"Cette partie reste à implémenter !" end_sub
sub verification() res% = DLL_call1("CreateMailbox",adr(mailbox_serveur$)) if res%<0 message "Le serveur est déjà lancé !"+chr$(13)+chr$(10)+"Impossible de le lancer une seconde fois !" terminate else mbx_serveur% = res% message "Le serveur a été lancé." end_if end_sub
sub fichiers() if file_exists(FichierEnseignants$)=0 file_open_write 1,FichierEnseignants$ file_writeln 1,EnteteEnseignants$ file_close 1 end_if file_open_read 1,FichierEnseignants$ file_readln 1,s$ if s$<>EnteteEnseignants$ message "LE fichier des enseignants esr invalide :"+chr$(13)+chr$(10)+"Veuillez appeler l'assistance !" terminate end_if grid_clear 2001,MaxEnseignants%+1,6 for i%=1 to MaxEnseignants% grid_write 2001,i%+1,1,str$(i%) next i% grid_write 2001,1,1,"#" grid_write 2001,1,2,"Nom" grid_write 2001,1,3,"Prénom" grid_write 2001,1,4,"ID" grid_write 2001,1,5,"Boite mail" grid_write 2001,1,6,"Pwd" for i%=1 to MaxEnseignants% if file_eof(1)=1 then exit_for file_readln 1,s$ p% = instr(s$,",") nom$ = left$(s$,p%-1) s$ = mid$(s$,p%+1,len(s$)) p% = instr(s$,",") prenom$ = left$(s$,p%-1) s$ = mid$(s$,p%+1,len(s$)) p% = instr(s$,",") id$ = left$(s$,p%-1) s$ = mid$(s$,p%+1,len(s$)) pwd$ = s$ grid_write 2001,i%+1,2,nom$ grid_write 2001,i%+1,3,prenom$ grid_write 2001,i%+1,4,id$ grid_write 2001,i%+1,5,"" : ' pas de boite à lettres à ce moment ! grid_write 2001,i%+1,6,pwd$ next i% file_close 1 NombreRequetesAcceptees% = 0 NombreRequetesRejetees% = 0 nActifs% = 0 ActiverServer(1) end_sub
sub MajEnseignants() file_open_write 1,FichierEnseignants$ file_writeln 1,EnteteEnseignants$ for i%=1 to MaxEnseignants% nom$ = grid_read$(2001,i%+1,2) prenom$ = grid_read$(2001,i%+1,3) id$ = grid_read$(2001,i%+1,4) pwd$ = grid_read$(2001,i%+1,6) if id$="" then exit_for s$ = nom$+","+prenom$+","+id$+","+pwd$ file_writeln 1,s$ next i% file_close 1 end_sub
sub ActiverServer(act%) if act%=1 serveurActif% = 1 caption 0,titre$+" (Actif)" caption 1001,"Le serveur est à l'écoute..." timer_on 90 else timer_off 90 serveurActif% = 0 caption 0,titre$+" (Inactif)" caption 1001,"Le serveur est suspendu..." end_if end_sub
fnc Crypter$(x$) dim_local s2$ s2$ = string$(50," ") res% = dll_call2("Crypt64",adr(x$),adr(s2$)) s2$ = trim$(s2$) result s2$ end_fnc
fnc Decrypter$(x$) dim_local s2$ s2$ = string$(50," ") res% = dll_call2("Uncrypt64",adr(x$),adr(s2$)) s2$ = trim$(s2$) result s2$ end_fnc
close0: res% = DLL_call1("CloseMailbox",mbx_serveur%) return close2100: active 0 to_foreground 0 return NouvelEnseignant: ModeOperation% = 1 inactive 0 secret_on 2114 pwdSecret% = 1 text 2111,"" text 2112,"" text 2113,"" text 2114,"" show 2100 to_foreground 2100 return pwdsecret: if pwdSecret%=1 secret_off 2114 else secret_on 2114 end_if pwdSecret% = 1 - pwdSecret% return ValiderEnseignant: select ModeOperation% case 1: gosub CreerEnseignant case 2: gosub RemplacerEnseignant end_select return CreerEnseignant: nom$ = trim$(text$(2111)) prenom$ = trim$(text$(2112)) id$ = trim$(text$(2113)) pwd$ = trim$(text$(2114)) if nom$="" message "Le nom de l'enseignant n'est pas renseigné !" return end_if if prenom$="" message "Le prénom de l'enseignant n'est pas renseigné !" return end_if if id$="" message "L'identifiant de l'enseignant n'est pas renseigné !" return end_if if pwd$="" message "Le mot de passe de l'enseignant n'est pas renseigné !" return end_if ' tester l'existence de l'identifiant dans la liste for i%=1 to MaxEnseignants% if grid_read$(2001,i%+1,4)="" then exit_for if grid_read$(2001,i%+1,4)=id$ message "Un enseignant avec l'identifiant "+id$+" existe déjà !" return end_if next i% ' chercher la première ligne libre for i%=1 to MaxEnseignants% if grid_read$(2001,i%+1,4)="" pwd$ = Crypter$(pwd$) : ' ici, le mot de passe est crypté ! grid_write 2001,i%+1,2,nom$ grid_write 2001,i%+1,3,prenom$ grid_write 2001,i%+1,4,id$ grid_write 2001,i%+1,5,"" : ' pas de boite mail pour le moment ! grid_write 2001,i%+1,6,pwd$ : ' ne sera pas visible dans la grille ! MajEnseignants() hide 2100 gosub Close2100 return end_if next i% message "La liste des enseignants est plaine !"+chr$(13)+chr$(10)+"Veuillez contacter l'assistance !" return
SupprimerEnseignant: if GridSelected%=0 message "Il faut sélectionner un enseignant !" return end_if i% = GridSelected% nom$ = grid_read$(2001,i%,2) prenom$ = grid_read$(2001,i%,3) s$ = "Voulez-vous vraiment supprimer l'enseignant:" + chr$(13)+chr$(10) s$ = s$ + nom$ + ", "+prenom$ + " ?" if message_confirmation_yes_no(s$)<>1 then return if i%<>MaxEnseignants% while grid_read$(2001,i%+1,4)<>"" for j%=2 to 6 s$ = grid_read$(2001,i%+1,j%) grid_write 2001,i%,j%,s$ next j% i% = i% + 1 end_while end_if for j%=2 to 6 grid_write 2001,i%,j%,"" next j% MajEnseignants() hide 2100 gosub Close2100 return return SelectEnseignant: GridSelected% = grid_y_to_row(2001,mouse_y_left_down(2001)) return ClickTab: select number_show case 1000: ActiverServer(1) case 2000: ActiverServer(0) case 3000: ActiverServer(0) end_select return ModifierEnseignant: if GridSelected%=0 message "Il faut sélectionner un enseignant !" return end_if ModeOperation% = 2 inactive 0 secret_on 2114 pwdSecret% = 1 text 2111,grid_read$(2001,GridSelected%,2) text 2112,grid_read$(2001,GridSelected%,3) text 2113,grid_read$(2001,GridSelected%,4) s$ = grid_read$(2001,GridSelected%,6) s$ = Decrypter$(s$) text 2114,s$ show 2100 to_foreground 2100 return RemplacerEnseignant: nom$ = trim$(text$(2111)) prenom$ = trim$(text$(2112)) id$ = trim$(text$(2113)) pwd$ = trim$(text$(2114)) pwd$ = Crypter$(pwd$)
if nom$="" message "Le nom de l'enseignant n'est pas renseigné !" return end_if if prenom$="" message "Le prénom de l'enseignant n'est pas renseigné !" return end_if if id$="" message "L'identifiant de l'enseignant n'est pas renseigné !" return end_if if pwd$="" message "Le mot de passe de l'enseignant n'est pas renseigné !" return end_if ' tester lla cohérence de l'identification de l'enseignant if id$<>grid_read$(2001,GridSelected%,4) s$ = "Voulez-vous vraiment changer l'ID de l'enseignant: "+chr$(13)+chr$(10) s$ = " "+grid_read$(2001,GridSelected%,4)+" --> "+id$+" ?" if message_conformation_yes_no(s$)<>1 then id$ = grid_read$(2001,GridSelected%,4) end_if pwd$ = Crypter$(pwd$) : ' ici, le mot de passe est crypté ! grid_write 2001,GridSelected%,2,nom$ grid_write 2001,GridSelected%,3,prenom$ grid_write 2001,GridSelected%,4,id$ grid_write 2001,GridSelected%,5,"" : ' pas de boite mail pour le moment ! grid_write 2001,GridSelected%,6,pwd$ : ' ne sera pas visible dans la grille ! MajEnseignants() hide 2100 gosub Close2100 return
' c'est ici qu'on va périodiquement tester si une requête est disponible TimerEvent: if serveurActif%=0 then return : ' ne rien faire si le serveur doit être inactif ! timer_off 90 TimerEventProcedure() timer_on 90 return sub TimerEventProcedure() ' variables uniquement pour TimerEvent: dim_local Ts$, Ts1$, Tp%, Ti%, Tj%, Tres%, Treq$, Tnom$, Tprenom$, Tid$, Tpwd$, Tmbx_Client$, Tok% Ts$ = str$(NombreRequetesAcceptees%)+" requêtes acceptées "+str$(NombreRequetesRejetees%)+" requêtes rejetées" caption 1002,Ts$ Tres% = DLL_call5("GetMailboxInfo",mbx_serveur%,adr(maxsiz%),adr(nxtsiz%),adr(cnt%),adr(tmo%)) if cnt%>0 : ' est-ce qu'il y a des requêtes en attente ? Tres% = DLL_call2("ReceiveMailboxMessage",mbx_serveur%,handle(99)) : ' prendre la quête la plus ancienne ' identifier la requête reçue Tmbx_Client$ = "" : ' par précaution... Ts$ = item_read$(99,1) + "," : ' prendre la première ligne de la requête Tp% = instr(Ts$,",") : ' chercher la première virgule Treq$ = Left$(Ts$,Tp%-1) : ' prendre le code de la requête Ts$ = Mid$(Ts$,Tp%+1,len(Ts$)) : ' éliminer le code de la requête Tp% = instr(Ts$,",") Tid$ = Left$(Ts$,Tp%-1) : ' récupérer l'ID de l'enseignant Ts$ = Mid$(Ts$,Tp%+1,len(Ts$)) : ' éliminer l'ID for Ti%=2 to MaxEnseignants%+1 Ts1$ = grid_read$(2001,Ti%,4) : ' lire le ID d'un enseignant dans la table if Ts1$="" then exit_for : ' fin de la liste ? if Tid$=Ts1$ : ' on a trouvé l'ID ? ' traiter le login ici if Treq$="LOGIN" Tok% = 1 : ' par défaut: ok Tp% = instr(Ts$,",") Tpwd$ = Left$(Ts$,Tp%-1) : ' récupérer le mot de passe de l'enseignant Ts$ = Mid$(Ts$,Tp%+1,len(Ts$)) : ' éliminer l'ID Tp% = instr(Ts$,",") Tmbx_Client$ = Left$(Ts$,Tp%-1) : ' récupérer la boite mail de l'enseignant if Grid_read$(2001,Ti%,6)<>Tpwd$ then Tok% = 0 : ' mot de passe erronné ! if grid_read$(2001,Ti%,5)<>"" then Tok% = 0 : ' boite à lettres déjà connectée ? grid_write 2001,Ti%,5,Tmbx_Client$ : ' mémoriser ma boite à lettre de l'enseignant if Tok%=0 Ts$ = "FAILED" if Tmbx_Client$<>"" then Tres% = DLL_call2("SendMailboxMessage",adr(Tmbx_Client$),adr(Ts$)) exit_sub end_if Ts$ = "OK" if Tmbx_Client$<>"" then Tres% = DLL_call2("SendMailboxMessage",adr(Tmbx_Client$),adr(Ts$)) NombreRequetesAcceptees% = NombreRequetesAcceptees% + 1 ' ajouter l'enseignant à la liste des enseignants actifs (grid 1003) nActifs% = nActifs% + 1 Tnom$ = grid_read$(2001,Ti%,2) Tprenom$ = grid_read$(2001,Ti%,3) grid_write 1003,nActifs%+1,2,Tnom$ grid_write 1003,nActifs%+1,3,Tprenom$ grid_write 1003,nActifs%+1,4,Tid$ grid_write 1003,nActifs%+1,5,Tpwd$ grid_write 1003,nActifs%+1,6,Tmbx_Client$ exit_sub end_if : ' fin LOGIN ' traiter le LOGOUT ici if Treq$="LOGOUT" Tmbx_Client$ = grid_read$(2001,Ti%,6) : ' mémoriser la mailbox du client Ts$ = "OK" if Tmbx_Client$<>"" then Tres% = DLL_call2("SendMailboxMessage",adr(Tmbx_Client$),adr(Ts$)) NombreRequetesAcceptees% = NombreRequetesAcceptees% + 1 ' chercher l'ID dans la liste des enseignants actifs (grid 1003) for Tj%=2 to MaxEnseignants%+1 if Tid$=grid_read$(1003,Tj%,4) : ' trouvé dans la liste des actifs ' alors supprimer de cette liste repeat : ' effacter l'enseignant déconnecté grid_write 1003,Tj%,2,grid_read$(1003,Tj%+1,2) grid_write 1003,Tj%,3,grid_read$(1003,Tj%+1,3) grid_write 1003,Tj%,4,grid_read$(1003,Tj%+1,4) grid_write 1003,Tj%,5,grid_read$(1003,Tj%+1,5) grid_write 1003,Tj%,6,grid_read$(1003,Tj%+1,6) until grid_read$(1003,Tj%+1,4)="" grid_write 2001,Ti%,6,"" : ' effacer la mailbox dans la liste des enseignants grid 2001 nActifs% = nActifs% - 1 exit_sub end_if next Tj% end_if : ' fin LOGOUT
' traiter toutes les aures requêtes ici... end_if : ' fin traitement ID trouvé dans le grid 2001
' ici, sortie pour requête non reconnué ou en erreur NombreRequetesRejetees% = NombreRequetesRejetees% + 1 Ts$ = "FAILED" if Tmbx_Client$<>"" then Tres% = DLL_call2("SendMailboxMessage",adr(Tmbx_Client$),adr(Ts$)) exit_sub next Ti% : ' fin des recherches de l'identifiant dans la liste des enseignants Ts$ = "FAILED" if Tmbx_Client$<>"" then Tres% = DLL_call2("SendMailboxMessage",adr(Tmbx_Client$),adr(Ts$)) end_if end_sub Cependant, pour sélectionner un enseignant à modifier ou à supprimer, ut peux cliquer sur n'importe quel champ de l'enseignant. Je n'utilise pas la position horizontale pour l'identifier - uniquement la position verticale du cluc dans le grid. | |
|