lien messages/méthodes

Inscrit
18 Février 2017
Messages
149
Reactions
18
#1
Bonjour à tous,

voilà je me posais une petite question:

Dans un émulateur, comment à partir d'un message qui contient aucune méthode, l'émulateur peut effectuer l'action en conséquence.?
Je me disais que peut-être par une interface et de la "reflection" ça pouvait se jouer, mais n'étant pas sûr de moi, je demande vos avis d'expert^^.

Merci d'avance de vos réponse
cordialement

Isodidacte
 

tazman59

Contributeur
Inscrit
20 Decembre 2012
Messages
149
Reactions
27
#2
Il suffit d’attribuer, dans un dictionnaire par exemple, un id de paquet à une fonction.
Quand tu reçois un message brut, tu lis l’id du paquet et en allant chercher dans ce dictionnaire tu pourras appeler la fonction qui gère la suite de données reçue.
 
Inscrit
18 Février 2017
Messages
149
Reactions
18
#3
Donc la fonction retourne l'id du message pour pouvoir être appairée dans le dictionnaire.?
 

tazman59

Contributeur
Inscrit
20 Decembre 2012
Messages
149
Reactions
27
#4
Oui chaque paquet contient un id, et toi au préalable tu auras attribué une fonction à un id, tout simplement.
 
Inscrit
18 Février 2017
Messages
149
Reactions
18
#5
D'accord merci bien de ton aide, ce fut très instructif^^

Une autre question liée indirectement:
En 2.x, comment savoir quelles maps sont pour quelles maisons.?
(Sniffer chaque maison risque d'être long :/)
 
Inscrit
4 Decembre 2016
Messages
30
Reactions
0
#6
Sinon tu peux simplement créer une instance de chaque message que tu mets ensuite dans une liste. Tu mets tes méthodes de handling dans une liste aussi.

Quand tu reçois un packet, t'obtient son nom en fonction de l'id reçu et tu invoques la méthode de handling correspondante au nom/id du packet avec les deux paramètres: le client et le message désérialisé.

C'est comme ça que fonctionnait mon émulateur et ça marchait très bien, comme ça pas besoin de spécifier quoi que ce soit ni d'utiliser de dictionnaire, tu ajoutes simplement tes handlers et ça sera pris en charge.
 
Inscrit
18 Février 2017
Messages
149
Reactions
18
#7
Ah oui effectivement, ça me paraît bien aussi.
Au départ j'avais pensé à faire les fonctions dans les classes message et avec une methode qui a en argument l'id du message et les argument deserialisés du packet.

Ainsi à chaque réception, cette methode là switch entre les id et active les fonctions demandés
 
Inscrit
6 Avril 2016
Messages
85
Reactions
40
#8
Sinon tu peux simplement créer une instance de chaque message que tu mets ensuite dans une liste. Tu mets tes méthodes de handling dans une liste aussi.

Quand tu reçois un packet, t'obtient son nom en fonction de l'id reçu et tu invoques la méthode de handling correspondante au nom/id du packet avec les deux paramètres: le client et le message désérialisé.

C'est comme ça que fonctionnait mon émulateur et ça marchait très bien, comme ça pas besoin de spécifier quoi que ce soit ni d'utiliser de dictionnaire, tu ajoutes simplement tes handlers et ça sera pris en charge.
Pas une super idée ça, ton List.Find(x=>x.Id == messageId) sera plus long que Dic[Id] , c'est l'avantage des dico ici
 
Inscrit
18 Février 2017
Messages
149
Reactions
18
#9
Effectivement ça sera toujours plus rapide que ma méthode^^
Merci à vous de vos réponses fortement instructive^^
 
Haut Bas