Question

Je suis en train d'envoyer / recevoir des données sur wifi à une application iPhone / iPod Touch à partir d'un serveur C # TCPIP. Pour cela, j'utilisé cocoaAsyncSocket du projet Google. Si je pousse un bouton et j'envoyer une demande de l'iPod vers le serveur, il renvoie les données demandées (titre de la chanson par exemple) .. Je veux savoir toutes les secondes quelle chanson est playng ... donc de C # serveur i envoie à des intervalles de 1 le second message à mon application. Dans mon application dans une minuterie avec l'intervalle de 1 seconde i appeler la méthode AsyncSocket lire readDataWithTimeout. Mon problème est que, après 8-9 secondes cette méthode n'est pas appelé plus. La connexion au serveur est toujours actif et le serveur C # envoie encore des données ..

ce que je veux faire est la chose suivante: -> winamp joue une chanson -> serveur C # demande winamp quelles chansons il est en cours de lecture et envoie le titre de la chanson à mon application. -> application iPhone reçoit les données et l'affiche

Je ne sais pas pourquoi la méthode readDataWithTimeout n'est pas appelé plus après une courte période de time..Maybe parce que le temps entre les messages envoyés par le serveur C #?

Merci, Sorin

Était-ce utile?

La solution 2

je l'ai fait work..after un peu plus la lecture ... donc à lire les données quand il arrive avec AsyncSocket sur des intervalles inconnus i utilisé le code de mise en jachère (je ne sais pas si est la meilleure solution, mais cela fonctionne pour ce je voulais):

- (void) readDataFromSocket
{
        [socket readDataWithTimeout:-1 tag:0];
}

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
    NSString *msg = [[[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding] autorelease];
    if(msg)
    {
        if([msg isEqualToString:@"something"])
        {
            Do stuff
        }
        else
        {
            Do something else
            }
        }
    }
    else
    {
        NSLog(@"Error converting received data into UTF-8 String");
    }
    [socket readDataWithTimeout:-1 tag:0];
}

j'appelle une fois dans ma demande la méthode readDataFromSocket qui appelle les prises [prise readDataWithTimeout: 0: -1 tag] méthode. Il devrait être appelé qu'une seule fois dans l'application, car dans la méthode - (void) onSocket: (AsyncSocket *) didReadData chaussette: (NSData *) withTag de données: méthode tag (long) dans la dernière ligne que j'appelle à nouveau la [prise readDataWithTimeout: -1 tag: 0]; qui raconte la prise d'écouter sur la prise. Lorsque des données arrive la prise lira.

il aide quelqu'un espère ..

Autres conseils

Plusieurs choses ici. Tout d'abord, pourquoi faire chaque seconde plutôt que sur les changements de la chanson? Cela va être très coûteux sur la batterie de l'iPhone à bavarder constamment cette façon. Il y a peu de raisons de le faire, même sur un bureau.

Donc, si je comprends bien, l'iPhone se connecte à .NET et demande la chanson. .NET retourne la chanson et laisse ouverte la prise. Chaque seconde, .NET écrit à sa prise, et chaque seconde iPhone lit de sa prise.

Ce que je pense qui se passe est que, à un moment donné le délai d'attente sur la readDataWithTimeout:tag: n'expire pas avant les prochains feux NSTimer (ni a aucune garantie réelle quand il se déclenche). Vous obtenez alors probablement deux appels readDataWithTimeout:tag: en cours d'exécution en même temps, obtenir probablement le délégué socket confus.

La meilleure solution est un "long sondage." Du côté de l'iPhone, appelez readDataWithTimeout:tag: avec un délai d'attente assez longue (disons 30-60s). Chaque fois qu'il revient, en boucle juste retour en elle:

while (self.isRunning) {
    [socket readDataWithTimeout:60 tag:0];
}

Ensuite, dans -onSocketDidDisconnect: et -onSocket:willDisconnectWithError:, assurez-vous de mettre à self.isRunning NO. Débarrassez-vous des tout NSTimer.

Je toujours pas poster quoi que ce soit du côté .NET jusqu'à ce que Winamp change réellement des chansons, cependant. Envoyer les mêmes données à plusieurs reprises ne pas faire à nouveau des faveurs.

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