GCDAsyncSocket - pas de réception de données - AsyncSocket fonctionne ok
J'ai fait un iPhone client de se connecter à un serveur à l'aide de GCDAsyncSocket. Le serveur est en cours d'exécution .Net sur un serveur Windows. La connexion est bonne et il envoie des données bien trop.
Je puis dire que le client entre en recevoir directement après l'envoyer...
[sock readDataToData:[GCDAsyncSocket LFData] withTimeout:15 tag:1];
J'ai aussi ce configuré pour recevoir:
- (void)onSocket:(GCDAsyncSocket *)sock didReadData:(NSData *)data
withTag:(long)tag
et aussi:
- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag
Si j'attends pour le moment hors du temps, hors de la méthode est appelée.
Si j'envoie des données à partir du serveur, le délai d'attente n'est pas appelée, je suppose
le client a vu quelque chose, mais il n'existe aucune indication que sur
le côté client.
J'ai également ajouté:
- (void)socket:(GCDAsyncSocket *)sock didReadPartialDataOfLength: (NSUInteger)partialLength tag:(long)tag
en espérant que je voudrais voir une partie de paquets, mais cela ne va pas déclenché
soit.
Comme je l'ai mentionné ci-dessus, le délai d'attente ne déclenche pas si j'envoie
quelque chose à partir du serveur vers le client. Cependant, j'aurais pensé
il serait également timeout si elle n'a pas reçu le terminator
caractère. J'ai aussi essayé de lecture avec une longueur de 3, mais qui n'a pas
faire toute la différence.
La GCDAsyncSocket est la le problème. AsyncSocket semble fonctionner ok.
Peut-être son init est le problème?
dispatch_queue_t mainQueue = dispatch_get_main_queue();
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:auto delegateQueue:mainQueue]
Toutes les idées que j'ai fait de mal?
J'ai mis un post sur les lunettes de code pour cela, mais il ny a pas toute l'activité ne sais pas si je vais avoir une réponse ou pas.
Idéalement, si quelqu'un a un exemple de code qui la reçoit œuvres, ce serait super! merci!!!!
Vous devez vous connecter pour publier un commentaire.
Peut-être il y avait quelque chose de mal avec l'orthographe. (Ce qui m'est arrivé et j'étais à la recherche pendant des heures jusqu'à ce que j'ai vu la petite différence)
GCDAsyncSocket renommé toutes délégué de rappels de onSocket à socket de faire correspondre les Pommes de nommage style.
Dans l'exemple ci-dessus, vous avez mentionné
renommer
Cela devrait résoudre le problème.
Et dans mon code j'ai eu un autre problème, aussi.
Assurez-vous que l'objet, qui appelle GCDAsyncSocket, est encore en vie alors que vous vous connectez. GCDAsyncSockets délégué est une faiblesse de la référence de votre objet. Et parce que sa asynchrone, le délégué peut devenir zéro (autorelease, ou l'instance a été créé à l'intérieur d'une méthode qui est déjà gauche), alors que le socket est de répondre. Comme conséquence, il semble ne pas être appelé, mais la classe qui a commencé le socket est déjà libéré de la mémoire. Cela se produit en particulier si vous utilisez un ARC avec GCDAsyncSocket.
Espère que cette aide
J'ai eu le même problème et était prêt à abandonner. Mon problème était du côté serveur. Dans ma méthode du délégué onSocket:didAcceptNewSocket: j'ai été l'appel d'une lecture sur la mauvaise prise. Cette résolu.
newSocket
délégué est héréditaire. Mais merci pour la façon!Êtes-vous sûr que votre serveur est l'envoi de données est arrêté avec juste un Saut de ligne et pas un CRLF? Ou peut-être les données que vous envoyez à partir de votre serveur n'est pas mis fin à quoi que ce soit?
readDataToData
va attendre jusqu'à ce qu'il touche ce caractère de terminaison dans les données reçues.Voici le code que j'utilise pour se connecter. J'ai enlevé ce que je ne pense pas nécessaire - j'espère que je n'ai pas pris de quelque chose d'important.
Init socket
Connecter
Sur connexion
Envoi (sans délai)
La demande de lire les données
De données est sorti (je suis juste envoyer des chaînes de caractère)
Je pense que le problème vient de ce que vous envoyez.
Si le contenu contient un LF quelque part dans votre fichier, la lecture se terminera quand il lit la LF.
Vous devez encoder en base64 avant l'envoi de votre fichier ou le lire jusqu'à une taille.
J'ai développé presque le même code, à côté serveur ios côté client vb net.
À partir de vb.net j'ai envoyer un fichier de 147 ko avec metod socket.sendfile ,tandis que dans ios une utilisation AsyncSocket donc:
Je n'ai pas personne ne de problème à se connecter et commencer à envoyer/recevoir,mais mon seul problème est que je reçois des 152 ko si j'utilise CRData et 143 ko si j'utilise LFData délimiteur.
La réponse est la suivante comment faire pour ajouter un séparateur en vb net quand j'ai envoyer le fichier?
Ajouter :
[chaussette readDataWithTimeout:-1 tag:0] ;
à la fin de didConnectToHost.