C# Problèmes de débutant ? :3

Inscrit
27 Aout 2012
Messages
264
Reactions
0
#1
Hello !

Après plusieurs semaines passées sur le forum en fantôme, je me décide enfin à poster ici puisque visiblement je n'arrive pas à me sortir de mon pétrin :D.
J'essaierai de vous expliquer rapidement ce qui m'arrive, sans trop m'étaler afin que vous ne preniez pas trop de temps à lire tout ça :).

Tout d'abord, je tiens à préciser que j'ai commencé à m'intéresser au C# il y a environ deux semaines, mais manipulant le PHP depuis plus de 5 ans, ça m'a quand même bien aidé (d'ailleurs, on m'a conseillé le C# parce que sa syntaxe se rapprochait de celle de PHP et effectivement, on est moins dépaysé ^^).
Bref, le C# est tout frais pour moi, d'où le titre de ce sujet. :)

Je trouve que malgré tout, je ne m'en sors pas trop mal. Je suis déjà arrivé bien plus loin que ce que je pensais pouvoir faire, mais voilà que je commence à bloquer.
J'ai tout d'abord commencé une solution en console, avec pas plus d'une ou deux classes, afin que je ne m'y perde pas trop.
Je suis arrivé à me connecter en socket, à récupérer et afficher les deux premiers packets envoyés par le serveur et vers la fin j'ai même réussi à afficher les deux variables de ProtocolRequired.
J'étais super content quoi ^^.

Puis, la console devenant étroite pour continuer, j'ai décidé de transférer ça dans une solution Windows Forms tout simple, un champ de texte et un bouton pour lancer le tout.
J'en ai profité pour faire un code plus clair et plus organisé, basé sur -bot-socket-les-fondamentaux.491/]le tutoriel de Maxilia. Je remercie aux passages tous les membres de ce forum qui ont posté des tutoriels, je crois en avoir lu plus des trois quart, ce qui m'a permis de bien comprendre :).

Seulement, il y a certains points que je n'ai pas tout à fait compris.
Avant de poser mes questions, à la fin de son tutoriel, il dit que pour voir si on avait bien tout compris, il fallait lier les trois classes créées. Voici donc, dans ma tête, comment je vois tout ça :
  • Au démarrage de l'application, on fait appel au constructeur MyBotSocket en lui fournissant de quoi se connecter au serveur, soit :
    Code:
    MyBotSocket _Socket = new MyBotSocket(new IPEndPoint(IPAddress.Parse("213.248.126.180"), 5555));
  • Lorsqu'on clique sur le bouton de connexion, on appelle la méthode ConnectAndListen() qui se charge de démarrer la connexion et le thread d'écoute (si j'ai bien compris), soit :
    Code:
    _Socket.ConnectAndListen();
  • C'est là que mon cerveau a commencé à chauffer :D. Le thread appelle la méthode Listening() qui, grâce à une boucle infinie, réceptionne les données du socket et les met dans le buffer. À la fin je suppose qu'on doit faire appel à la méthode Enqueue() vu qu'en toute logique on ne peut pas appeler le constructeur PacketBufferEventArg() puisqu'il nécessite l'ID du packet (que ProcessQueue() se chargera de récupérer). [1]
  • Une fois que ProcessQueue() a fait son boulot, il déclenche l’évènement PacketBufferEventArg() en lui donnant tout ce dont il a besoin. Le tout est stocké... Et là je ne vois plus... Je suppose qu'il y a un lien avec GetPacket vu qu'on retrouve e.PacketId et e.Data dans son code. Dans les paramètres on a "object Obj" ce qui me fait penser qu'on appellera cette méthode via un évènement (je me trompe ?) mais laquelle (j'ai vu deux évènements, un dans MyBotSocket et un dans MyBotPacketDeserializer) ?
  • Et là c'est le noir complet :D. Comment fonctionne le reste ? [2]

Voilà un peu comment je vois ça dans ma tête. Les numéros entre crochets, c'est pour que je m'y retrouve avec les questions que je vais vous poser tout de suite pour ne pas rallonger encore le sujet :
  • [1] La méthode Enqueue() se situe dans la classe PacketBufferEventArg(). J'ai mit pas mal de temps avant de comprendre que je ne pourrais pas y accéder et que sa place n'était sûrement pas ici. Pour y accéder il faut d'abord instancier PacketBufferEventArg()... qui demande l'ID du packet... qui est donné par ProcessQueue(). Du coup, je ne sais pas où le mettre, donc je l'ai mit dans la classe MyBotSocket() (juste après la méthode d'écoute) qui me semble être le bon endroit.
  • [2] La question est toute bête, le début du raisonnement est-il bon ? Comment continuer ? Des pistes ?
  • [3] Je crois avoir un problème de visibilité entre mes classes. Dans ma classe principale, j'ai fait une méthode Log() qui se charge d'écrire dans le champ de texte. Je n'y ai pas accès depuis la classe MyBotSocket alors que tout est en public. Je n'ai pas déclaré cette dernière comment enfant de la classe principale et je pense que ça ne doit pas être fait. Du coup, est-ce normal que je n'aie pas accès à cette classe ? Où puis-je la mettre pour y avoir accès de partout ?
  • [4] Lorsque j'ai déplacé la méthode Enqueue() (et donc ProcessQueue() et DequeueByteUtils() aussi) dans la classe MyBotSocket(), je me retrouve avec des erreurs "Le nom _ByteQueue n'existe pas dans le contexte actuel.". Or, j'ai bien déplacé aussi ces deux petites lignes en-haut de la classe MyBotSocket :
    Code:
    public Queue<byte> _byteQueue = new Queue<byte>();
    public event EventHandler<PacketBufferEventArg> RecievePacketBuffer;
    Je crois donc que j'ai ici aussi un souci de visibilité, mais d'où vient tout ça ?

Tellement de questions, si j'en demande trop, n'hésitez pas à me le dire sincèrement, je n'ai pas envie qu'on me mâche le travail, d'ailleurs si je veux comprendre, c'est des pistes qu'il me faut pour que je puisse trouver de moi-même, un petit coup de pouce :).
Après plusieurs heures à essayer de comprendre, je m'en rend finalement à vous, je trouve que j'ai fait tout de même une bonne partie du chemin, mais je suis face à une barrière et vous avez sûrement la clé pour l'ouvrir et me permettre de continuer (ouaaaaaaah ! :3).

Après relecture, j'me dis que c'est quand même un gros pavé, c'est plus fort que moi... Désolé :/.
Bonne soirée à vous ! :)


EDIT : J'ai un peu avancé sur la compréhension et je crois pouvoir continuer :
  • J'ai pas tout à fait cerné le lien avec GetPacket(), mais une fois que la méthode est appelée, elle se charge faire ce qu'il faut en fonction du packet (je pense) dans le switch. Ensuite, elle appelle la méthode deserialize qui doit être contenue dans la classe correspondant (pour suivre le modèle imposé par l'interface IServerPacket). Une fois tout ça deserializé, on lance l'évènement PacketEventArg. Il stocke ça dans une variable et je pense que c'est pour qu'on y accède au niveau de la classe principale.

C'est encore bien flou, et une nouvelle question me vient à l'esprit, est-ce vraiment utile d'utiliser des évènements ? Je n'en vois pas l'intérêt. Après, je n'ai pas reconnu de ligne permettant d'abonner une classe à un évènement (est-ce que ça fait partie de notre boulot "lier les trois classes" ?) mais si c'est le cas je pense que c'est comme cela qu'on lierai les classes.
 
Haut Bas