Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Gestion d'un système client-serveur. | |
| | |
Auteur | Message |
---|
Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Jeu 25 Avr 2024 - 19:31 | |
| Bonsoir à tous.
Je souhaiterais créer un système de gestion de fichier en tant que client-serveur. Le fichier est un fichier texte contenant des données sur des élèves. Il doit pouvoir être accessible par les profs, en lecture seule. Seul le Directeur d'établissement peut modifier ce fichier.
KGF.DLL fait référence à un objet MailBox Windows. Mais je ne sais vraiment pas comment l'utiliser.
Merci de votre aide. | |
| | | 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. Mer 1 Mai 2024 - 23:59 | |
| Alors, voilà comment faire: - tu utilises des boites à lettre de type 2 selon la documentation disponible ici: http://klauspanoramic.infinityfreeapp.com/CommunicationentreprogrammesInte.html- tu mets en place une structure en réseau de plusieurs ordinateurs "esclave" et un seul ordinateur "maître" - le fichier à à gérer est sur l'ordinateur "maitre" - seul de directeut de l'établissement a accès à l'ordinateur maître, et tu y places toutes les applications nécessaires au directeur pour exploiter le fichier - sur les machines "esclaves", tu places des applications destinées àl'usage des autres personnes (enseignants, ...) - ces applications "esclaves" n'ont aucun accès au fichier concerné - sur la machine "maître", tu places un programme "serveur" qui tourne en permanence, sans intervention du directeur. Il peut tourner en détaché, sans interface utilisateur, mais il est peut-être intéressant de lui donner une Form 0 affichant en permanence l'état du système (nombre d'esclaves connectés, nombre d'actions en cours, ...) - le "serveur" crée une "boite à lettres" de type 2 vers laquelle tous les esclaves peuvent envoyer des messages. - - chaque "esclave" crée sa propre boite à lettres et envoie des "requêtes" au serveur, le serveur les exécute et renvoie éventuellement une réponse, de type "ok", "erreur" ou "données demandées" - une fois la connexion établie, le serveur identifie l'esclave expéditeur d'une requêtre par l'adresse de sa boite à lettres dédiée - le "serveur" gère en interne une table avec la liste des "esclaves" connectés avec leurs boites mail concernées - le "serveur" gère aussi en interne l'idntifiant de l'élève sur lequel l'enseignant leut intervenir (information à placer dans la table des enseignants connectés) - à toi de définir les requêtres? Quant au système de gestion de ces boites à lettre, chaque requête et chaque réponse du serveur est juste un texte, mono- ou multi-ligne. La structure interne de chaquemessage est à définir par toi, en fonctiion de ton application. - ainsi, chaque "esclave" peut demander au "serveur" sur le "maître" d'effectuer des tâches, et le "maitre" peut renvoyer les informations nécesaires à l'"esclave" selon ses bsoins. Exemples de requêtes, côté "esclave": LOGIN,IdentifiantEnseignant,MotDePasse,BoiteALettresEsclave LOGOUT,IdentifiantEnseignant OPEN,IdentifiantEnseignant,IdentifiantEleve CLOSE,IdentifiantEnseignant ADD,IdentifiantEnseignant,TypeEnregistrement,CleData,Data REPLACE,IdentifiantEnseignant,CleData,NewData DELETE,IdentifiantEnseignant,CleData READ,IdentifiantEnseignant,CleData ... Dans ce genre d'architexture, il est conseillé d(utiliser l'identifiant enseignant comme partie variable du nom de boite à lettres. Exemple des noms de boite à lettres: Serveur: \\system\mailslot\path\GestionEleves_Server Enseignant Charles Dupont: \\system\mailslot\path\GestionEleves_CDupont La structure du "serveur" devrait être: - initialisation de toutes les variables - vérification si la boite à lettres du "serveur" existe. Si oui, refuser le lancement - un exemplaire du "serveur" est DEJA EN COURS ! - création de la boite à lettres du "serveur" - attente de requêtres des "esclaves" Pour chaque requête: - décoder le mot-clé de la requête - agir en correspondance Par exemple, refuser toute action si l'émetteur (identifié par la boite à lettre d'émission) n'est pas connecté (pas de LOGIN). Dans ce cas, renvoyer simplement un message NOLOGIN. Exemples des réponses du "serveur": LOGIN,OK LOGIN,ERROR NOLOGIN REQUEST,OK DATA,DonneesDemandees ... Bon, je pense que tu as là un peu de matière à réflexion pour ton projet. N'hésite pas à demander d'autres précisions si besoin. Mais, surtout, lis attentivement la page de doc dont je t'ai donné l'URL, ainsi que les pages documentant les fonctions décrites. Bonne chance ! | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Jeu 2 Mai 2024 - 11:56 | |
| Bonjour.
Un grand merci Klaus pour toutes tes explications. Cela a le mérite d'être très clair. | |
| | | 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. Jeu 2 Mai 2024 - 13:18 | |
| Par exemple, pour tester si le serveur est déjà lancé, ou pour lancer le serveur en exemplaire unique, tu peux faire comme ceci: - Code:
-
' Outils pour client-serveur.bas
label close0, Test_Server, Start_Server
dim res%, mailbox_server$, mailbox_client$, mbx_server%, mbx_client% mailbox_server$ = "\\.\mailslot\GestionEleves_Server" mailbox_client$ = "\\.\mailslot\GestionEleves_CDupont"
dll_on "KGF.dll"
on_close 0,close0 button 1 : top 1,10 : left 1,10 : caption 1,"Test server" : on_click 1,Test_Server button 2 : top 2,top(1)+height(1) : left 2,10 : caption 2,"Start server" : on_click 2,Start_Server
end
close0: res% = DLL_call1("CloseMailbox",mbx_server%) res% = DLL_call1("CloseMailbox",mbx_client%) return
Test_Server: mbx_server% = DLL_call1("CreateMailbox",adr(mailbox_server$)) if mbx_server%<0 message "Le serveur est déjà lancé !" else message "Le serveur n'est pas encore lancé !" res% = DLL_call1("CloseMailbox",mbx_server%) end_if return Start_Server: res% = DLL_call1("CreateMailbox",adr(mailbox_server$)) if res%<0 message "Le serveur est déjà lancé !"+chr$(13)+chr$(10)+"Impossible de le lancer une seconde fois !" else mbx_server% = res% message "Le serveur a été lancé." end_if return Essaie les deux boutons ! EDITNote la routine close0 qui est appelée par un ON_CLOSE 0 ! Comme le dit la doc, une telle boite à lettres est "globale" et n'est donc pas supprimée lorsque le programme l'ayant créée se termine. Il faut donc prendre soin de la supprimer lorsqu'on n'en a plus besoin. Sinon, elle existera jusqu'au reboot du système ! | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Jeu 2 Mai 2024 - 15:51 | |
| Bonjour.
@Klaus.
J'obtiens le message d'erreur suivant:
Exception EConvertError dans le module kgf.dll à 0000A5EA 'beta' n'est pas une valeur entière correcte.
Merci de la suite. | |
| | | 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. Jeu 2 Mai 2024 - 16:52 | |
| Constat: la version Panoramic_Editor V1.0 Beta 1 ne peut pas exécuter DLL_ON !
Il faut reprendre une version V09.29 i11 ou antérieure. Là, ça marchera.
Une version Beta est juste une version de test, et on découvrira certainement d'autres anomalies... | |
| | | 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 3 Mai 2024 - 0:24 | |
| Complément d'information pour le système client/serveur: Si le serveur est sur un PC différent des PB's des clients (ce qui est probablement le cas !), il faut employer la stratégie suivante. Il faut jouer sur les éléments des noms des boites à lettres. Leur structure générale est: - Citation :
- \\emplacement\mailslot\nom
En bleu ( \\ et \mailslot\) sont des mentions obligatoires. emplacement est le nom de l'ordinateur sur lequel la boite mail est localisée. nom est le nom de la boite mail. Le serveur et les clients créent chacun leur propre boite mail ui est localisée sur la machine sur laquelle le programme concerné tourne. Dans ce cas, on utilise juste un pint (.) comme emplacement pour la créatioin, comme ceci: - Citation :
- \\.\mailslot\nom
Je conseille d'utiliser des noms évitant les risques de confusion pour la partie nom de la boite mail, comme par exemple gestioneleves_server pour le serveur et gestioneleves_xxx pour les enseignants, xxx étant une combinaison unique de leurs initiales et leur nom de famille. Si un client veut envoyer un message (une requête) au serveur, il faut spécifier l'adresse de la boite mail du serveur, mais en précisant le nom du serveur à la bonne place dans l'adresse mail. Evidemment, comme il n'y a qu'un seul serveur, tous les clients utilisent la même adresse avenc le même nom de machine pour cette adresse. Cependant, chaque client fonctionnant sur une machine différente, il faut informer le serveur sur l'adresse mail du client lorsque celui-ci effectue son login. La requête LOGIN prendra donc le format suivant: LOGIN,nom,motdepasse,boitemail- nom étant la combinaison d'initiales et nom de famille de l'enseignant, - boitemail étant l'adresse de la boite mail que le client a créée pour cet enseignant, mais contenant le nom de la machine de l'enseignant à la place du point (.) qui a été utilisée pour créer la boite mail de l'enseignant. - motdepasse est le mot de passe de l'enseignant, crypté bien sûr. Pour pouvoir se connecter, l'enseignant doit saisir son "nom" et son mot de passe. Ces informations sont alors utilisées pour établir le nom de la boite mail, puis la requête LOGIN complète. Ainsi, le serveur pourra mettre dans ses tables les noms de tous les enseignants connectés ainsi que leurs boites mail, et la communication bidirectionnelle devient possible. Evidemment, sur le serveur, il doit y avoir un panneau de contrôle (sous forme d'une fenêtre auxiliaire du serveur ou sous la forme d'un programme indépendant) qui gère la liste des ensegnants autorisés à seconnecter, avec au moins leur nom complet, leur nom technique et leur mot de passe. Ce fichier peut être crypté - il y a les fonctions nécessaires pour dela dans KGF.dll. Ainsi, lorsque le serveur reçoit une requête LOGIN, il pourra vérifier la légalité de la connextion et l'autoriser ou la refuser. J'espère avoir été suffisamment clair, mais n'hésite pas à poser des questions le cas échéant. JE suis désolé,, mais un système client/serveur est complexe et requiert un minimum de mesures de sécurité. | |
| | | 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. Dim 5 Mai 2024 - 1:42 | |
| J'ai écrit un prototype pour un serveur de ce type. Ce programme prend en charge la gestion de la liste des enseignants autorisés ) ce connectier, avec la gestion de nomn prénom, identifiant, mot de passe (crypté) dans un fichier spécifique. Le serveur charge ce fichier au démarrage, et en crée un, vide, lors du premier lancement. On peut ajouter es enseignants, en supprimer et modifier leurs champs. Le fichier est mis à jour automatiquement à chaque modification. Jamais les mots de passe ne sont enregistrés en clair. Le programme montre 3 onglets: - un moniteur d'activité, avec le nombre de requêtes traitées ou refusées et la liste des enseignants connectés à tout moment - un volet de maintenance du fichier des enseignants (le traitement des requêtes est autimatiquement suspendu) - un volet de traitement des données des élèves (éditions, ...) pour lequel rien n'est implémenté (le traitement des requêtes est autimatiquement suspendu) Un retour sur le volet d'activité réactive automatiquement le traitement des requêtes. Le traitement de deux requêtes est implémenté: LOGIN et LOGOUT. L'endroit pour insérer le traitement des requêtes application est documenté dans le source. Voici le code: - 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é u'un un seul exemplaire sur sa machine. ' Il crée une boit 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 dim titre$ : titre$ = "Gestion des élèvers - Serveur" end_sub
sub variables() dim res%, s$, i%, j%, p% dim mbx_serveur%, pwdSecret%, nom$, prenom$, id$, pwd$, GridSelected% dim serveurActif%, ModeOperation%, maxsiz%, nxtsiz%, cnt%, tmo% dim NombreRequetesAcceptees%, NombreRequetesRejetees% ' variables uniquement pour TimerEvent: dim Ts$, Tp%, Ti%, Tj%, Tres%, Treq$, Tnom$, Tprenom$, Tid$, Tpwd$, tmnx_Client$, TnActifs% 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,100 : 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 à l'écoute..." 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,300 grid_one_column_width 1003,6,1 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,300 grid_one_column_width 2001,6,1 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() dll_on KGFdll$ 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 TnActifs% = 0 timer_on 90 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)" else serveurActif% = 0 caption 0,titre$+" (Inactif)" 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 Ts$ = str$(NombreRequetesAcceptees%)+" requêtes acceptées "+str$(NombreRequetesRejetees%)+" requêtes rejetées" caption 1002,Ts$ res% = 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 ? res% = 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$,1,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 Ts$ = grid_read$(2001,i%,4) : ' lire le ID d'un enseignant dans la table if Ts$="" then exit_for : ' fin de la liste ? if Tid$=Ts$ : ' on a trouvé l'ID ?
' traiter le login ici if Treq$="LOGIN" 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 Ts$ = Mid$(Ts$,Tp%+1,len(Ts$) : ' éliminer l'ID if Grid_read$(2001,Ti%,6)<>Tpwd$ then exit_for : ' mot de passe erronné ! if grid_read$(2001,Ti%,5)<>"" then exit_for : ' boite à lettres déjà connectée ? grid_write 2001,Ti%,5,Tmbx_Client$ : ' mémoriser ma boite à lettre de l'enseignant 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) TnActifs% = TnActifs% + 1 Tnom$ = grid_read(2001,Ti%,1) Tprenom$ = grid_read(2001,Ti%,2) grid_write 1003,TnActifs%+1,2,1,Tnom$) grid_write 1003,TnActifs%+1,3,1,Tprenom$) grid_write 1003,TnActifs%+1,4,1,Tid$) grid_write 1003,TnActifs%+1,5,1,Tpwd$) grid_write 1003,TnActifs%+1,6,1,Tmbx_Client$) timer_on 90 return 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 timer_on 90 return 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$)) timer_on 90 return next Ti% : ' fin des requêtes en attente end_if timer_on 90 return
Prochainement, il y aura un prototype pour un client correspondant. | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Dim 5 Mai 2024 - 8:53 | |
| Bonjour à tous.
@Klaus.
Un grand merci pour ton aide sur ce projet qui me tient à coeur.
Bon, j'ai lancé ton programme avec une version antérieure de l'éditeur Panoramic, et tout fonctionne bien.
Cependant, j'obtiens un message d'erreur (ligne 274), lorsque je veux enregistrer un nouvel enseignant, comme suit:
Nom: Enseignant test Prénom: test ID: 123456 Mot de passe: azerty99
Mais peut-être ai-je saisi de mauvaises informations !
Merci de la suite. | |
| | | 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. Dim 5 Mai 2024 - 10:58 | |
| Tu as raison ! J'avais oublié de publier la version de KGF.dll qui va avec! Désolé.
Recharge KGF.dll et essaie à nouveau... | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Dim 5 Mai 2024 - 13:55 | |
| Bonjour.
Désolé Klaus, mais l'erreur persiste ligne 274, avec la nouvelle version de kgf.dll ! Meri de la suite.
| |
| | | 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. Dim 5 Mai 2024 - 15:13 | |
| Ce n'est pas normal. A partir de mon site, tu as dû télécharger KGF.zip du 05/05/2024. A l'intérieur de cette archive, tu as KGF.dll du 05/05/2024 de 7065 ko. Sa version doit être V10.05. Exécute ceci: - Code:
-
dim res%, s$ s$ = string$(50," ") dll_on "KGF.dll" res% = dll_call1("KGFdllVersion",adr(s$)) s$ = trim$(s$) message str$(res%)+" "+s$ end
Tu devrais obtgenir ceci: | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Lun 6 Mai 2024 - 8:23 | |
| Bonjour.
@Klaus.
Il affiche version 8.70 !!
J'ai pourtant bien téléchargé la version à partir de ta signature. Mais j'ai peut-être téléchargé la mauvaise version.
Merci de la suite. | |
| | | 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. Lun 6 Mai 2024 - 10:23 | |
| Je viens de tester - le fichier KGF.zip téléchargé d'après ma signature contient bien KGF.dll de la bonne version. Mais il faut extraire KGF.dll de KGF.zip et l'installer dans dossier où le programme attend de trouver la DLL... | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Lun 13 Mai 2024 - 8:06 | |
| Bonjour à tous.
Un grand merci Klaus pour ton aide précieuse. Je vais étudier tout cela. | |
| | | 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. Lun 13 Mai 2024 - 17:01 | |
| J'ai fair évoluer le prototype du serveur. Il est opérationnel maintenant et reconnaît et gère le login. La partie client est en cours d'élaboration. Voici déjà, en avant-première, le server: - 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 timer_on 90 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..." else 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
| |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Jeu 16 Mai 2024 - 13:55 | |
| Un grand bravo Klaus.
Je rencontre cependant l'erreur suivante:
Not correct arithmetic expression, error in function line 71.
Merci de la suite. | |
| | | 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. Jeu 16 Mai 2024 - 17:28 | |
| C'est parce que tu n'as pas la bonne version de KGF.dll. La version actuelle est KGF.dll V10.06 du 06/05/2024.
Télécharge KGF.dll et réessaie - il n'y aura plus de problèmes. | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Jeu 16 Mai 2024 - 20:13 | |
| Bonsoir.
Je viens de télécharger la version de kgf.dll datée du 6 mai, sous ta signature. Malheureusement, j'obtiens toujours le même message d'erreur.
Merci de la suite. | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Gestion d'un système client-serveur. Jeu 16 Mai 2024 - 23:32 | |
| Bonjour ! - Pedro a écrit:
- Je viens de télécharger la version de kgf.dll datée du 6 mai, sous ta signature.
Malheureusement, j'obtiens toujours le même message d'erreur.
Juste un petit mot pour dire que ça fonctionne bien chez moi : | |
| | | 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 - 1:15 | |
| Et, comme tu peux voir dans la capture de Marc, tu peux voir que la fonction "ComputerName" (celle qui pose problème dans ton post) marche bien chez Marc: C'est cette fonction qui donne le nom du système sur lequel le programme s'exécute. | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Ven 17 Mai 2024 - 7:20 | |
| Bonjour à tous.
Ah, enfin, je viens de trouver la source du problème. Tout venait de panoramic.exe, qui était situé dans un dossier différent de kgf.dll.
Tout rentre dans l'ordre maintenant.
Merci Klaus et Marc. | |
| | | 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 - 9:32 | |
| | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Gestion d'un système client-serveur. Ven 17 Mai 2024 - 10:32 | |
| Bonjour.
J'ai donc créé un enseignant nommé test. Ensuite, j'ai tenté de le supprimer.
D'abord, l'enseignant ne disparaît pas dans le grid.
Et de plus j'obtiens le message d'erreur suivant:
No corresponding end_if found line 485
Merci de la suite. | |
| | | 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 - 13:12 | |
| Je pense que cette version corrige ce problème. En tout cas, ça marche chez moi: - 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
| |
| | | Contenu sponsorisé
| Sujet: Re: Gestion d'un système client-serveur. | |
| |
| | | | Gestion d'un système client-serveur. | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |