Bonsoir, désolé à l'avance pour écrire tant, mais je ne sais pas où l'erreur est ...socket asynchrone, recevoir des messages chaîne
Mon application cliente reçoit du serveur de manière asynchrone. Je veux transférer un tas de choses à la fois (le contenu d'un tableau, quelques centaines d'octets). Je souhaite que le serveur puisse envoyer des "commandes" et qu'une fonction du côté client agisse en fonction de ces commandes, par exemple si le message du serveur lit "print_hello"
, il doit appeler une fonction qui imprime bonjour . Maintenant, je crois comprendre que lorsque je reçois des données de manière asynchrone, je ne peux pas savoir quelle quantité de données a été envoyée (ou si plus de données que prévu ont été envoyées), donc j'ai besoin de stocker toutes les données un tampon, et quand un signe "fin de commande" (par exemple, '!'
) a été reçu, il devrait savoir appeler la fonction.
Jusqu'à présent, cela a du sens pour moi, mais je ne parviens pas à le mettre en œuvre. Dans ma fonction de rappel DataReceived, j'ai ce code:
Console.WriteLine("Raw data: {0}", data));
mainBuffer += data;
Console.WriteLine(mainBuffer);
mainBuffer est déclarée comme volatile static string mainBuffer = "";
La première ligne se imprime correctement, et passe par toutes les données comme prévu. Cependant, lorsque j'imprime le mainBuffer
, il n'imprime que le tout premier jeu de données que j'ai reçu, le reste n'est pas ajouté au tampon.
Ce qui pourrait causer cela? Thread problèmes de sécurité? Est-ce que je ne lis pas la dernière valeur de mainBuffer? Je ne peux pas utiliser les points d'arrêt pour déboguer ceci.
Exemple de sortie:
Raw data: ABC
ABC
Raw data: DEF
ABC
RAW data: GHI
ABC
Petite mise à jour, j'essayé d'utiliser un aussi bien volatile static int
, et il incrémente et imprime correctement après chaque DataReceived()
. La chaîne n'est toujours pas mise à jour cependant.
Où avez-vous déclaré mainBuffer? Êtes-vous sûr de ne pas le réinitialiser à "" chaque fois que vous recevez? – Eiver