7
votes

Gcdasyncsocket - ne recevant pas de données - asyncsocket fonctionne ok

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 ... xxx

J'ai aussi ce jeu Jusqu'à recevoir: xxx

et aussi: xxx

Si j'attends le délai d'attente de la méthode TIME OUT .

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.

J'ai aussi ajouté: xxx

En espérant que je verrais un paquet partiel, mais cela ne se déclenche pas Soit.

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.

Le gcdasyncsocket est le problème. Asyncsocket semble fonctionner correctement.

Peut-être que son init est faux?

Dispatch_Queue_t MAINUEU = DISPATCH_GET_MAIN_QUEUE ();

Auto-DéléguéQueue: Mainqueur]

Des idées Ce que j'ai mal fait?

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.

Idéalement si quelqu'un a un code d'exemple que le reçoit des œuvres qui seraient super! merci!


0 commentaires

6 Réponses :


3
votes

Ê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? READDATATODATATA CODE> Attendra que cela frappe ce caractère de terminaison dans les données reçues.

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> xxx pré>

connectez xxx pré>

sur la connexion p> xxx pré>

Envoi (sans délai) p>

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];


7 commentaires

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.



9
votes

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 


3 commentaires

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.



0
votes

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];
}


0 commentaires

1
votes

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.


0 commentaires

3
votes

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. xxx


2 commentaires

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 est hérité. Mais merci d'avoir pointé le chemin!


Merci, j'appelle aussi Readdata sur Chaussette au lieu de "Newsocket"



1
votes

Ajouter:

[SOCK READDAWITHITIMOOUT: -1 TAG: 0]; CODE> P>

à la fin de DIDConnectThost. P>

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
    //Your Code

    [sock readDataWithTimeout:-1 tag:0];
}


1 commentaires

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