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

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
marcgforce
Niveau 3
Niveau 3
Messages : 33
Enregistré le : lun. 07 mars 2016 07:20
Status : Hors ligne

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

#1

Message par marcgforce » mar. 01 nov. 2016 16:06

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

illwind33
Niveau 1
Niveau 1
Messages : 12
Enregistré le : sam. 27 févr. 2016 18:42
Localisation : toulouse
Status : Hors ligne

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

#2

Message par illwind33 » mar. 01 nov. 2016 21:00

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+

Répondre