Question

J'exécution 4 commandes de démarrage et attend également de recevoir 4 réponses. Le serveur est déjà mis en œuvre et un autre dev qui développe Android, est en mesure de recevoir ces 4 réponses distinctes, cependant, je reçois 2 bonnes réponses (séparées), puis 3e et 4e réponses viennent comme une réponse. I'v placé NSLog de résultat NSData dans completeCurrentRead, et il me transmet fusionné paquet « 0106000000000b0600000000 » au lieu de paquets séparés « 010600000000 » et « 0b0600000000 ». I'v également testé les 3e et 4e commandes separatedly (une seule à la fois) et tout est OK avec le serveur, il les envoie séparément, mais il se produit la fusion (avec 3 et 4) si les quatre commandes sont exécutées dans une ligne . Toutes les idées?

Mise à jour: Je pense que I'v remonter aux racines du problème. Il y a un appel qui lit les données de paquets à partir d'un flux de méthode doBytesAvailable:

CFIndex result = [self readIntoBuffer:subBuffer maxLength:bytesToRead];

Et dans readIntoBuffer: maxLength, il y a un appel (longueur == 256):

return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length);

Alors, CFReadStreamRead retourne longueur incorrecte du paquet - il retourne longueur de 12 (au lieu de 6), et également grappins les données fusionnées. Hm, ce qui pourrait provoquer CFReadStreamRead lire deux paquets en un seul, au lieu de les lire séparément ...

MAJ2: J'utilise onSocket: didReadData: withTag: méthode déléguée et attend de recevoir des données de réponse avec l'étiquette de la demande je fis. Je me suis rendu compte récemment, les flux sont des flux, et non pas des paquets mais comment je peux résoudre ce? les réponses du serveur ne dispose pas de terminaison à caractères début et la fin de la réponse, juste la taille de la réponse, qui se présente comme 2 - 5 octets. Je peux couper la première partie de la réponse (premier paquet) et d'ignorer la deuxième partie, mais comment faire une autre AsyncSocket vais rappel avec la deuxième partie de la réponse (deuxième paquet)? Si je ne couper que les premières parties et ignorer la seconde à mon humble avis, puis le second « paquet » sera perdu ...

Comment couper la première partie de la réponse et dire AsyncSocket de faire un autre rappel avec étiquette et la deuxième partie de la réponse en tant que rappel séparée?

Update3: Dans onSocket: didReadData: withTag :, I coupe manuellement réponse fusionné, traiter la première partie (premier paquet), puis à la fin, lancer un appel à onSocket: didReadData: withTag: encore:

if (isMergedPacket) {
  ...
 [self onSocket:sock didReadData:restPartOfTheResponse withTag:myCommandTag];
}

Cependant, il semble que AsyncSocket paires lui-même chaque paquet de demande avec son paquet de réponse (par classe AsyncReadPacket) en utilisant les balises. Donc, ma coupe manuelle fonctionne, mais AsyncSocket ne sait pas que je l'ai déjà deux paquets manipulé, et il essaie toujours de lire le deuxième paquet. Donc, je suis en train de chaussette: shouldTimeoutReadWithTag: ... rappel qui est appelée quand une opération de lecture a atteint son délai d'attente sans terminer.

Était-ce utile?

La solution

solution trouvée. Il est pas nécessaire de changer et de creuser dans AsyncSocket. Il vous suffit de définir la longueur de chaque réponse - combien d'octets vous intéressé par la lecture et l'obtention de votre rappel. Plus d'informations vous pouvez sur autre poste ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top