FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» bouton dans autre form que 0
Gestion d'un système client-serveur. Emptypar leclode Hier à 13:59

» KGF_dll - nouvelles versions
Gestion d'un système client-serveur. Emptypar Klaus Hier à 11:41

» Gestion d'un système client-serveur.
Gestion d'un système client-serveur. Emptypar Klaus Hier à 10:23

» PANORAMIC V 1
Gestion d'un système client-serveur. Emptypar papydall Sam 4 Mai 2024 - 3:43

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Gestion d'un système client-serveur. Emptypar Froggy One Jeu 2 Mai 2024 - 11:16

» @Jack
Gestion d'un système client-serveur. Emptypar Jack Mar 30 Avr 2024 - 20:40

» trop de fichiers en cours
Gestion d'un système client-serveur. Emptypar papydall Lun 29 Avr 2024 - 23:39

» Une calculatrice en une ligne de programme
Gestion d'un système client-serveur. Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
Gestion d'un système client-serveur. Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
Gestion d'un système client-serveur. Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
Gestion d'un système client-serveur. Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
Gestion d'un système client-serveur. Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

» Dessine-moi une galaxie
Gestion d'un système client-serveur. Emptypar jjn4 Lun 22 Avr 2024 - 13:47

» Erreur END_SUB
Gestion d'un système client-serveur. Emptypar jjn4 Lun 22 Avr 2024 - 13:43

» Bug sur DIM_LOCAL ?
Gestion d'un système client-serveur. Emptypar papydall Dim 21 Avr 2024 - 23:30

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le Deal du moment : -28%
Brandt LVE127J – Lave-vaisselle encastrable 12 ...
Voir le deal
279.99 €

 

 Gestion d'un système client-serveur.

Aller en bas 
2 participants
AuteurMessage
Pedro

Pedro


Nombre de messages : 1555
Date d'inscription : 19/01/2014

Gestion d'un système client-serveur. Empty
MessageSujet: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyJeu 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.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12289
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Gestion d'un système client-serveur. Empty
MessageSujet: Re: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyMer 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 !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Pedro

Pedro


Nombre de messages : 1555
Date d'inscription : 19/01/2014

Gestion d'un système client-serveur. Empty
MessageSujet: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyJeu 2 Mai 2024 - 11:56

Bonjour.

Un grand merci Klaus pour toutes tes explications.
Cela a le mérite d'être très clair.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12289
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Gestion d'un système client-serveur. Empty
MessageSujet: Re: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyJeu 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 !

EDIT

Note 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 !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Pedro

Pedro


Nombre de messages : 1555
Date d'inscription : 19/01/2014

Gestion d'un système client-serveur. Empty
MessageSujet: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyJeu 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.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12289
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Gestion d'un système client-serveur. Empty
MessageSujet: Re: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyJeu 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...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12289
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Gestion d'un système client-serveur. Empty
MessageSujet: Re: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyVen 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é.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12289
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Gestion d'un système client-serveur. Empty
MessageSujet: Re: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyDim 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Pedro

Pedro


Nombre de messages : 1555
Date d'inscription : 19/01/2014

Gestion d'un système client-serveur. Empty
MessageSujet: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyDim 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.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12289
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Gestion d'un système client-serveur. Empty
MessageSujet: Re: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyDim 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...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Pedro

Pedro


Nombre de messages : 1555
Date d'inscription : 19/01/2014

Gestion d'un système client-serveur. Empty
MessageSujet: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyDim 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.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12289
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Gestion d'un système client-serveur. Empty
MessageSujet: Re: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyDim 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:
Gestion d'un système client-serveur. Aa1131
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Pedro

Pedro


Nombre de messages : 1555
Date d'inscription : 19/01/2014

Gestion d'un système client-serveur. Empty
MessageSujet: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyHier à 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.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12289
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Gestion d'un système client-serveur. Empty
MessageSujet: Re: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. EmptyHier à 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...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé





Gestion d'un système client-serveur. Empty
MessageSujet: Re: Gestion d'un système client-serveur.   Gestion d'un système client-serveur. Empty

Revenir en haut Aller en bas
 
Gestion d'un système client-serveur.
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Serveur FTP gratuit.
» Problème d'accès à mon serveur FTP habituel.
» 2.35 du 21 mai 2013: gestion d'un serveur FTP
» Système de gestion de convecteurs électriques (carte Arduino
» Serveur RPC pas disponible

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: