J'ai fait un client iPhone Connectez-vous à un serveur à l'aide de GCDASYNCSocket. Le serveur exécute .NET sur un serveur Windows. La connexion est bonne et elle envoie des données bien aussi.
I. Je dis ensuite au client d'entrer dans la réception directement après l'envoi ... p> J'ai aussi ce jeu Jusqu'à recevoir: p> et aussi: p> Si j'attends le délai d'attente de la méthode TIME OUT . p> Si j'envoie des données du serveur, le délai d'attente n'est pas appelé, alors je suppose
Le client a vu quelque chose, mais il n'y a aucune indication de cela sur
le côté du client. p> J'ai aussi ajouté: p> En espérant que je verrais un paquet partiel, mais cela ne se déclenche pas
Soit. p> Comme je l'ai mentionné au-dessus du délai d'attente ne déclenche pas si j'envoie
quelque chose du serveur au client. Cependant j'aurais pensé
il importerait également si cela n'a pas reçu le terminateur
personnage. J'ai aussi essayé de lire avec une longueur de 3 mais cela n'a pas
faire toute différence. P> Le gcdasyncsocket est le problème. Asyncsocket semble fonctionner correctement. P> Peut-être que son init est faux? P> Dispatch_Queue_t MAINUEU = DISPATCH_GET_MAIN_QUEUE (); p> Auto-DéléguéQueue: Mainqueur] P> Des idées Ce que j'ai mal fait? p> J'ai mis un message sur le code de lunette pour cela, mais il n'y a aucune activité, donc pas sûr de ne pas avoir une réponse ou non. P> Idéalement si quelqu'un a un code d'exemple que le reçoit des œuvres qui seraient super! merci! p> p>
6 Réponses :
Êtes-vous sûr que votre serveur envoie des données terminées par un seul linefeed et non un CRLF? Ou peut-être que les données que vous renvoyez de votre serveur ne sont-elles pas terminées avec quoi que ce soit? Voici le code que j'utilise pour vous connecter. J'ai dépouillé ce que je ne pense pas être nécessaire - j'espère que je n'ai rien sorti d'important. P> socket init p> connectez sur la connexion p> Envoi (sans délai) p> READDATATODATATA CODE> Attendra que cela frappe ce caractère de terminaison dans les données reçues.
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
Oui c'est à coup sûr l'envoi correctement. J'ai essayé d'utiliser Telnet pour vous connecter au serveur et tout est bon. J'ai également changé le .h et .m pour utiliser la version plus ancienne sans le GDC et cela fonctionne.
@Mark WoreNop Consultez la réponse mise à jour - J'ai inclus le code que j'utilise pour connecter et envoyer / recevoir des données. Espérons que quelque chose pourrait aider!
J'ai changé en classe ASYNCSocket sans le GCD et cela fonctionne plus ou moins. La Nsdata semble être chaude de la façon dont vous avez défini cela, mais que vous le laissez simple, cela fonctionne. Ensuite, j'ai changé à la classe GCD et au même problème.
Je ne suis pas sûr de quoi suggérer d'autre. Le seul problème que j'avais était sur Bluetooth avec iOS5, mais c'est toujours sous la NDA, donc je ne peux pas en parler.
Ce code fonctionne pour moi ... J'ai juste besoin de vous assurer que toutes les chaînes que j'ai envoyées sont attachées avec \ r \ n.
@ T1000 Vous pouvez modifier cela si nécessaire en channant le CRLFDATA pour être LFDATA ou CRDATA dans la méthode ReadDaTaTaDaTaTaDaTata.
Mon problème s'est avéré être que je ne le disais pas explicitement de lire des données. Ajouter [Chaussette ReadDawithTimeout: -1 Tag: 0] Est-ce que le travail a fait le travail.
Peut-être qu'il y avait quelque chose qui ne va pas avec l'orthographe. (Donc, cela m'est arrivé et je cherchais des heures jusqu'à ce que j'ai vu la petite différence)
gcdasyncsocket a renommé tous les rappels de délégués de Onsocket Strong> à Socket Strong> Pour faire correspondre des pommes Naming Style. P> Dans votre exemple ci-dessus, vous avez mentionné P> - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
Cette information sur la faible référence m'a aidé. Je n'aurais jamais trouvé ça. Merci
Mille appréciations! Cela me retenait.
Gcdasyncsockets Délégué est une référence faible m'a été perdue! Pour ceux qui se battent toujours, comme @Jackpearse a déjà dit, le journal de la méthode Didaccept sera nettoyé s'il quitte la méthode par Arc, qui est un collecteur à ordures. Vous devez l'affecter à la variable membre de la classe pour vous assurer que l'arc ne nettoie pas votre presse.
J'ai développé presque le même code, serveur latéral IOS Client VB Net. De vb.net, j'envoie un fichier de 147 kb avec socket METOD.SendFile, tandis que dans iOS a utilisez asyncsocket SO:
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag; { [sock readDataToData:[AsyncSocket CRData] withTimeout:-1 tag:0]; [dataFile appendData:data]; }
Je pense que le problème provient de ce que vous envoyez. Si le contenu contient un LF quelque part dans votre fichier, la lecture se terminera lorsqu'elle lit le LF. Vous devez coder de base64 avant d'envoyer votre fichier ou de lire jusqu'à une taille. p>
J'ai eu le même problème et j'étais prêt à abandonner. Mon problème était le côté serveur. Dans ma méthode de délégation Onsocket: DidacceptNewsocket: J'appelle une lecture sur la mauvaise prise. Cela résolu.
Oui, j'étais coincé ça aussi. Il n'est pas clair dans les exemples d'asyncsocket "Runloop" si cette syntaxe est correcte, cependant. Par exemple, il apparaît que le délégué Newsocket code> est hérité. Mais merci d'avoir pointé le chemin!
Merci, j'appelle aussi Readdata sur Chaussette au lieu de "Newsocket"
Ajouter:
à la fin de DIDConnectThost. P> [SOCK READDAWITHITIMOOUT: -1 TAG: 0]; CODE> P>
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
//Your Code
[sock readDataWithTimeout:-1 tag:0];
}
Si quelqu'un a le même problème en 2021, cela pourrait toujours fonctionner pour vous, ça m'a définitivement fait pour moi