Page 1 sur 1

[Ex] Deux applications fonctionnant en mode "Client-Serveur"

Posté : mar. 01 nov. 2016 16:06
par marcgforce
Bonjour à tous,

Depuis quelques temps déjà j'avais dans l'idée de créer une application permettant de prévenir les utilisateurs connectés sur leur poste de travail d'un message important... j'ai donc imaginé une application en deux parties : un "serveur" jouant le rôle d'écriture du message, installé sur un poste dédié, et un "client" installé sur tous les autres postes ayant besoin du service. Aucun lien réseau entre eux si ce n'est la présence d'un fichier de configuration définissant le chemin vers fichier commun situé sur un lecteur réseau nommé "readme.txt" et parametrable dans les deux applications ; Le serveur est chargé d'écrire les messages dans celui-ci, le client est chargé de les lires.
Le serveur est une simple GUI avec un richedit (pour le CTRL+A), le client est basé sur un programme en systray qui, à l'arrivée d'un nouveau message (changement de date du fichier ou fichier >0 octets) déclenche un splashtexton lisant ce readme.txt et se refermant après 20 secondes. Toutes les secondes, la présence du fichier est testé ainsi que la date comparée.

testé sur 3 ordinateurs en réseau ce dernier fonctionne parfaitement. Si certains se sentent d’améliorer le code en utilisant un protocole plutot qu'un fichier sera très enrichissant. De mon coté, dans mon entreprise, il faut ouvrir des portes dans l'antivirus, ce qui n'est jamais très bon quand on veut mettre de la sécurité dans son réseau.

Je vous laisse les codes sources:
l'application serveur :
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=MESSAGE-INFO-CIC.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <file.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiRichEdit.au3>
$version="version 1.0"
$textoffile=""
$textforwrite=""
$sfile = @TempDir & "\readme.txt"
$fileconfig = @ScriptDir & "\confmessager.ini"

$Form1 = GUICreate("GENEREZ UN MESSAGE A AFFICHER", 603, 200, 154, 280)
$Button_cancel = GUICtrlCreateButton("Annuler", 396, 136, 97, 25)
$Button_ok = GUICtrlCreateButton("OK", 292, 136, 89, 25)
$Edit1=_GUICtrlRichEdit_Create($Form1,"", 16, 32, 481, 97,BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
;$Edit1 = GUICtrlCreateEdit("", 16, 32, 481, 97)
$Label1 = GUICtrlCreateLabel("Entrez ici le texte du message à faire afficher dans les Aubettes", 16, 8, 301, 17)
$Button_suppr = GUICtrlCreateButton("Supprimer fichier", 504, 30, 89, 41)
$Button_suppr_text = GUICtrlCreateButton("Supprimer texte", 504, 80, 89, 41)
$MenuItem1 = GUICtrlCreateMenu("&Menu")
$menuitem3 = GUICtrlCreateMenu("&Aide")
$idFileItem1 = GUICtrlCreateMenuItem("&Configuration", $MenuItem1)
$idFileItem2 = GUICtrlCreateMenuItem("&Supprimer le texte", $MenuItem1)
$idFileItem3 = GUICtrlCreateMenuItem("S&upprimer readme.txt", $MenuItem1)
$aideitem=GUICtrlCreateMenuItem("A propos",$menuitem3)
$helpitem=GUICtrlCreateMenuItem("Aide",$menuitem3)
$fileconfig=@ScriptDir & "\confmessager.ini"
$recherche_fileconfig= FileFindFirstFile($fileconfig)

if $recherche_fileconfig = -1 Then
   $RechercherFichier = FileSelectFolder("Application non configurée, veuillez indiquer le repertoire pour le fichier Readme.txt", @WindowsDir)
   If @error Then
      MsgBox(0,"MESSAGE-INFO-CIC Erreur !", "Sans ce fichier readme.txt je ne sers a rien !" & @CRLF & "Je quitte...")
      _exit_app()
   Else
      ConsoleWrite("le fichier existe")
      IniWriteSection($fileconfig, "config", "chemin=" & $RechercherFichier & "readme.txt")
      if @error then
         msgbox(64,"MESSAGE-INFO-CIC","Erreur, je n'ai pas pu ecrire le fichier")
      Else
         msgbox(64,"MESSAGE-INFO-CIC","Le fichier de configuration a été ecrit avec succès" & @crlf & "le chemin est : " & IniRead($fileconfig, "config", "chemin", "Erreur") & @CRLF & "n'oubliez pas de coper ce fichier de configuration" & @CRLF & "avec le logiciel INFO-PAF")
      EndIf
      Global $sfile = IniRead($fileconfig, "config", "chemin", "Erreur")

   EndIf
Else
   Global $sfile = IniRead($fileconfig, "config", "chemin", "Erreur")
EndIf

if FileExists($sfile) Then ; gestion du fichier readme.txt
   $fileopen = FileOpen($sfile)
   $textoffile=FileRead($sfile)
   _GUICtrlRichEdit_AppendText($Edit1, $textoffile & _dateheure & @CRLF) ; la preference pour cette fonction est simple, elle permet de faire un ctrl  + a dans l'edit
   FileClose($fileopen)
else
   _GUICtrlRichEdit_AppendText($Edit1, _dateheure() & @CRLF) ; permet d'horodater le message
EndIf


GUISetState(@SW_SHOW)



While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE, $Button_cancel
         _exit_app() ; on ne peut pas mettre un exit directement rich text edit demande a ce que la gui soit supprimée avant sinon crash
      case $Button_ok
         FileDelete($sfile) ; on efface l'ancien fichier
         _FileCreate($sfile); pour le recreer
         $text = _GUICtrlRichEdit_GetText($Edit1) ; recuperation du texte dans l'edit
         $aText = StringRegExp($text, '(?m)^(.+|\s+)$', 3) ; et copie dans un buffer des caractères
         For $i = 0 To UBound($aText) - 1
            $textforwrite = $aText[$i]
            FileWriteLine($sfile, $textforwrite & @crlf) ; pour les envoyer dans le fichier readme.txt
         Next
         Exit
      Case $Button_suppr, $idFileItem3 ; gestion du bouton supprimer fichier et du menu supprimer
         FileClose($sfile)
         FileDelete($sfile)
         msgbox(64,"MESSAGE-INFO-CIC","Fichier supprimé !")
         _exit_app()
      case $idFileItem1 ; gestion de la configuration de l'ini
         _Configfichier()
      case $idFileItem2, $Button_suppr_text ; gestion de la suppression du texte; si on ne veux pas supprimer le fichier.
         _GUICtrlRichEdit_AppendText($Edit1," ")
         send("{LCTRL}^{a}") ;CTRL + A
         send("{DEL}") ;DEL
         _GUICtrlRichEdit_AppendText($Edit1, _dateheure() & @CRLF)
      Case $aideitem
         MsgBox(0,"MESSAGE-INFO-CIC","Concept & devellopement" & @CRLF & "Marc GRAZIANI", 10)
      Case $helpitem
         _splashtext_aide()
   EndSwitch
WEnd

Func _Configfichier()
   $msg = MsgBox(4, "MESSAGE-INFO-CIC", "le fichier de configuration indique :" & @CRLF & IniRead($fileconfig, "config", "chemin", "non configuré") & @CRLF & @CRLF & "Voulez vous le changer ?")
   If $msg = 6 Then
      $RechercherFichier = FileSelectFolder("Veuillez indiquer le repertoire pour le fichier Readme.txt", @WindowsDir)
      IniWriteSection($fileconfig, "config", "chemin=" & $RechercherFichier & "readme.txt")
      if @error then
         msgbox(64,"MESSAGE-INFO-CIC","Erreur, je n'ai pas pu ecrire le fichier")
      Else
         msgbox(64,"MESSAGE-INFO-CIC","Le fichier de configuration a été ecrit avec succès" & @crlf & "le chemin est : " & $RechercherFichier & "\readme.txt" & @CRLF & "n'oubliez pas de copier ce fichier de configuration" & @CRLF & "Sur les postes en aubette")
      EndIf
      $sfile = IniRead($fileconfig, "config", "chemin", "Non configuré")
   Else
      Return
   EndIf
EndFunc   ;==>_Configfichier

Func _exit_app()
   _GUICtrlRichEdit_Destroy($Edit1)
   exit
EndFunc

Func _dateheure()
   $date="Le " & @MDAY & "/" & @MON & "/" & @YEAR & " à " & @HOUR & ":" & @MIN & ":" & @SEC & " Venant de " & @UserName
   return $date
EndFunc

func _splashtext_aide()
   local $larg = 600, $haut = 400
   Local $PosW = @DesktopWidth / 2 - $larg, $PosH = @DesktopHeight / 2 - $haut - 65 ; Global $PosW = @DesktopWidth - $larg, $PosH = @DesktopHeight - $haut - 65 ; en bas a droite
;Global Const $PosW = 1, $PosH = @DesktopHeight - $haut - 50 ; en bas a gauche
   local $helptext = @CRLF & _
                 "Ce logiciel à été pensé pour permettre au personnel travaillant en aubette" & @CRLF & _
                 "d'être informé en temps réel de l'arrivée d'une fiche dans les locaux de la CIC " & _
                 "l'opérateur CIC écrit son message et en cliquant sur ok, un fichier commun aux deux " & _
                 "applications nommé ""readme.txt"" sera ecrit puis lu par l'application INFO-PAF-CIC " & _
                 "qui l'affichera sur les ecran des ordinateurs."  & @CRLF & _
                  @CRLF & _
                 "Lors du premier lancement le fichier de configuration est écrit et le chemin pour écrire le readme.txt " & _
                 "demandé. Il est important de noter que le le fichier readme.txt doit être écrit dans un lecteur réseau commun "  & _
                 "aux deux applications."  & @CRLF & _
                  @CRLF & _
                 "L'application permet à tout moment de supprimer ce fichier, lorsqu'il n'existe pas, INFO-PAF-CIC reste silencieux. "  & _
                 "Seul une modification du message va reveiller le logiciel INFO-PAF-CIC"  & @CRLF

   local $hSplash = SplashTextOn("MESSAGE-INFO-CIC-" & $version, '', $larg, $haut, $PosW, $PosH, 0 + 16, '', 11, 700)
   ControlSetText($hSplash, '', 'Static1', $helptext)
   WinSetState($hSplash, '', @SW_SHOW)
   sleep(20000)
   WinSetState($hSplash, '', @SW_HIDE)

EndFunc
l'application client :
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=INFO-PAF-CIC.exe
#AutoIt3Wrapper_Run_Tidy=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <Misc.au3>
#include <TrayConstants.au3>
$fileconfig = @ScriptDir & "\confmessager.ini"
Global $findfile = FileFindFirstFile($fileconfig)
If $findfile = -1 Then
   IniWriteSection($fileconfig, "config", "chemin=Non configuré")
   Global $sfile = "vide"
Else
   Global $sfile = IniRead($fileconfig, "config", "chemin", "Non configuré")
EndIf

Global $filenew = False, $filetime = "", $connected = ""
Opt("TrayMenuMode", 3) ; The default tray menu items will not be shown and items are not checked when selected. These are options 1 and 2 for TrayMenuMode.
Opt("TrayOnEventMode", 1)

Global $larg = 400, $haut = 200
Global $PosW = @DesktopWidth / 2 - $larg, $PosH = @DesktopHeight / 2 - $haut - 65 ; Global $PosW = @DesktopWidth - $larg, $PosH = @DesktopHeight - $haut - 65 ; en bas a droite
;Global Const $PosW = 1, $PosH = @DesktopHeight - $haut - 50 ; en bas a gauche
Global $hSplash = SplashTextOn("-INFO-PAF-CIC- INFORMATIONS IMPORTANTES ", '', $larg, $haut, $PosW, $PosH, 4 + 16, '', 11, 700)
WinSetState($hSplash, '', @SW_HIDE)



Tray()


While 1
   _main()
WEnd


Func _main()
   If _testfile() = True Then
      ;ConsoleWrite("le fichier existe ! " & @CRLF)
      _readfile()
      $local_filetime = _file_time_compare()
      If $local_filetime = True And FileGetSize($sfile) > 0 Then
         For $i = 1 To 3
            ControlSetText($hSplash, '', 'Static1', $connected)
            WinSetState($hSplash, '', @SW_SHOW)
            Sleep(100)
            WinSetState($hSplash, '', @SW_HIDE)
            Sleep(100)
         Next
         WinSetState($hSplash, '', @SW_SHOW)
         Sleep(15000)
         WinSetState($hSplash, '', @SW_HIDE)
         TraySetState($TRAY_ICONSTATE_STOPFLASH)
         $count = 1
      Else
         ;ConsoleWrite("$filetime est false " & @CRLF)
         Sleep(1000)
      EndIf
   Else
      ;ConsoleWrite("$file dont exist " & @CRLF)
      ;ControlSetText($hSplash, '', 'Static1', "")
      ;WinSetState($hSplash, '', @SW_HIDE)
      ;TraySetState($TRAY_ICONSTATE_STOPFLASH)
      Sleep(1000)
      _testfile()
   EndIf
EndFunc   ;==>_main

Func _file_time_compare()
   Local $lookfiletime = FileGetTime($sfile, 0, 1)
   If $lookfiletime <> $filetime Then
      ;ConsoleWrite("ancien : " & $filetime & " nouveau : " & $lookfiletime & @CRLF)
      $filenew = True
      $filetime = $lookfiletime
      ;ConsoleWrite("nouveau $filetime est : " & $filetime & @CRLF)
      Return $filenew
   EndIf
EndFunc   ;==>_file_time_compare

Func Tray()
   TraySetClick(8) ;8 = Pressing secondary mouse button  mouseclicks will display the tray menu
   TrayCreateItem("About")
   TrayItemSetOnEvent(-1, "About")
   TrayCreateItem("")
   TrayCreateItem("Config")
   TrayItemSetOnEvent(-1, "_configfichier")
   TraySetIcon("shell32.dll", 24)
   TraySetOnEvent($TRAY_EVENT_PRIMARYDOWN, "TrayEvent")
   TraySetState($TRAY_ICONSTATE_FLASH)
EndFunc   ;==>Tray

Func about()
   MsgBox(64, "-INFO-PAF-CIC-", "Concept & developpement" & @CRLF & "Marc GRAZIANI", 5)
EndFunc   ;==>about

Func _Configfichier()
   $msg = MsgBox(4, "messager", "le fichier de configuration indique :" & @CRLF & IniRead($fileconfig, "config", "chemin", "non configuré") & @CRLF & @CRLF & "Voulez vous le changer ?")
   If $msg = 6 Then
      $RechercherFichier = FileSelectFolder("Veuillez indiquer le repertoire pour le fichier Readme.txt", @WindowsDir)
      IniWriteSection($fileconfig, "config", "chemin=" & $RechercherFichier & "readme.txt")
      If @error Then
         MsgBox(64, "messager", "Erreur, je n'ai pas pu ecrire le fichier")
      Else
         MsgBox(64, "messager", "Le fichier de configuration a été ecrit avec succès" & @CRLF & "le chemin est : " & IniRead($fileconfig, "config", "chemin", "Non configuré") & @CRLF & "n'oubliez pas de copier ce fichier de configuration" & @CRLF & "Sur les postes en aubette")
      EndIf
      $sfile = IniRead($fileconfig, "config", "chemin", "Non configuré")
   Else
      Return
   EndIf
EndFunc   ;==>_Configfichier


Func TrayEvent()
   ;cw('TrayEvent'&@TAB&@TRAY_ID)
   Switch @TRAY_ID
      Case $TRAY_EVENT_PRIMARYDOWN
         $iState = WinGetState($hSplash, '')
         ;cw('WinGetState'&@TAB&$iState)
         Switch BitAND($iState, 2)
            Case False
               WinSetState($hSplash, '', @SW_SHOW)
               TraySetState($TRAY_ICONSTATE_STOPFLASH)
            Case True
               WinSetState($hSplash, '', @SW_HIDE)
               TraySetState($TRAY_ICONSTATE_FLASH)
         EndSwitch
   EndSwitch
EndFunc   ;==>TrayEvent

Func _testfile()
   $testfile = FileFindFirstFile($sfile)
   If $testfile = -1 Then
      ;ConsoleWrite("$file dont exist " & @CRLF)
      Return False
   Else
      ;ConsoleWrite("$file exist " & @CRLF)
      Return True
   EndIf
EndFunc   ;==>_testfile

Func _readfile()
   If $sfile = "vide" Or $findfile = -1 Then Return
   $fileopen = FileOpen($sfile)
   $connected = FileRead($sfile)
   $fileclose = FileClose($fileopen)
   If $fileclose = 0 Then ConsoleWrite("erreur de fermeture du fichier ! " & $sfile & @CRLF)
   ;ConsoleWrite($connected & @CRLF)
   Return $connected
EndFunc   ;==>_readfile

Func cw($text, $line = @ScriptLineNumber)
   ConsoleWrite(StringFormat("%04d", $line) & @TAB & '|')
   ConsoleWrite($text)
   ConsoleWrite('|' & @LF)
EndFunc   ;==>cw

Re: deux applications fonctionnant en mode "Client-Serveur"

Posté : mar. 01 nov. 2016 21:00
par illwind33
Bonjour,

Comme c'était juste une mise à jour de mon vieux post, je remonte le votre au-dessus

je n'ai jamais utilisé de fonctions réseau mais je chercherais du côté de chez Swan TCPSend (Sends data on a connected socket)

https://www.autoitscript.com/forum/topi ... r-network/
https://www.autoitscript.com/forum/topi ... using-tcp/

A+