[UDF] Connexion.au3 ou comment télécommander une application

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
poke123
Niveau 2
Niveau 2
Messages : 26
Enregistré le : mer. 24 mars 2010 14:22
Status : Hors ligne

[UDF] Connexion.au3 ou comment télécommander une application

#1

Message par poke123 »

► Afficher le texteNotes de MAJ
Introduction:
Bonjour à tous, je viens parler d'un petit travail fait à la va vite au lycée pour permettre à deux applications de se commander mutuellement à travers internet, cependant pour y arriver j'ai remarquer que au final j'avais créer autre chose qui pourrait presque être un deuxième UDF mais bon j'en reparle plus loin.
La télécommande:
le fonctionnement est simple et basique, un exemple valant mieux qu'un long discours:

Programme 1 (cette application doit être lancé en premier):

Code : Tout sélectionner

#include "Connexion.au3"
Global $lol = 4
$v = RemoteServ("127.0.0.1", 85)
while True
    sleep(3000)
    if not TestClient($v) then Exit
WEnd
func Alert($var)
    MsgBox(0, "", $var & " vaut " & eval($var)) 
EndFunc
 
ce programme attend les instruction du deuxième que voici:

Code : Tout sélectionner

#include "Connexion.au3"
$v = Remote("127.0.0.1", 85)
sleep(500)
Local $a[1]
$a[0] = "lol"
SetDistant("lol", GetDistant("lol") + 1)
CallDistant("alert", $a)

while True
    sleep(3000)
    if not TestClient($v) then Exit
WEnd
 
Explication:
au niveau de la création du canal, connexion tcp classique, une IP et un port (le même pour les deux)
la fonction RemoteServ reste à l'écoute, la fonction Remote expire si elle n'a pas de réponse, d'où l'ordre proposé
dans le premier programme vous voyez une variable $lol, la ligne SetDistant("lol", GetDistant("lol") + 1) lui ajoute 1 ensuite la fonction alert($var) est appelé avec pour paramètre "lol".
si vous lancez les deux application, vous observerez une msgbox contenant "lol vaut 5" (lancé par le premier programme)

ces trois choses basiques peuvent être utilisé pour la création d'un logiciel de contrôle à distance ou pour déléguer des taches de calculs par exemple.
La Communication avec pattern:
Ici c'est un peu plus complexe: le principe est que quand un texte est reçu, si ce dernier correspond à un pattern prédéfini, une fonction est appelé. c'est avec ça que fonctionne les fonctions ci dessus, exemple:

Code : Tout sélectionner

func GetDistant($var) ;obtient une variable (sans le "$") de l'autre client
    SendData("get " & $var)
    return ListenFor("result (.+)")
EndFunc
allant avec:

Code : Tout sélectionner

func _get($data, $m)
    SendData("result " & Eval($m[0]))
EndFunc
Explication:
La fonction _get est enregistré avec ListenForRegister($text, $callback) qui lui associe le pattern "get (.+)" $data correspond à la chaine reçu "get variable" et $m correspond aux résultats de stringregexp (donc un array des résultats). Quand la fonction GetDistant est appelée elle envoi une requète à l'autre client puis attend la réponse (pendant 10 secondes maximum)

Ceci peut être utilisé pour une communication plus poussé entre applications et de manière plus sécurisé (car oui, pouvoir appeler toute les fonctions d'un script c'est chelou, autant le désactiver pour quelque chose de sensible)
La sécurité:
Est innexistante car la structure de la chose ne permet pas d'appliquer un standard pour tous, il faut que chacun choisisse une méthode c'est pourquoi je vous recommande fortement de modifier la fonction d'envoi et la fonction de reception de données qui sont ici:

Code : Tout sélectionner

;Fonction d'écoute Formaté (pour appliquer un encryptage, ou comme je l'ai fait, pour éviter les empilages de données par exemple)
func Listen()
    $d = TCPRecv($Global_Connexion_Listen, 1000)
    if $d = "" then return 0
    _Debug("Reception de: " & $d)
    $data = _StringBetween($d , "<data>", "</data>")
    for $i = 0 to UBound($data) - 1
        _Debug("Instruction: " & $data[$i]) 
        _do($data[$i])
    Next
EndFunc

;Fonction d'envoi Formaté (voir ci dessus)
func SendData($data)
    _Debug("Envoi de: " & $data)
    TCPSend($Global_Connexion_Listen, "<data>" & $data & "</data>")
EndFunc
Et enfin car c'est quand même mieux, L'UDF dans son intégralité:
► Afficher le texteConnexion.au3
Exemples avancées:
voici une application complète utilisant cet UDF, c'est une éspèce de méssagerie utilisable sur les résaux type lycée avec dossier partagé par exemple:
► Afficher le textechat.au3
Modifié en dernier par poke123 le jeu. 22 mars 2012 18:13, modifié 3 fois.
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [UDF] Connexion.au3 ou comment télécommander une applica

#2

Message par lesolutionneur »

Simple mais efficace. Bravo pour cet UDF !
Répondre