Frage

Ich versuche, Daten über WiFi zu einem iPhone / iPod Touch App von einem C # tcpip Server zu senden / empfangen. dafür verwendet i cocoaAsyncSocket aus dem Projekt Google. Wenn ich einen Knopf drücken, und ich sende eine Anfrage vom iPod auf dem Server gibt es die angeforderten Daten (Songtitel zum Beispiel) .. ich jede Sekunde wissen will, welches Lied ist playng ... so von C # Server i in Intervallen von 1 schicken zweite Nachrichten zu meiner App. In meiner Anwendung in einem Zeitgeber mit dem Intervall von 1 Sekunde nenne ich die AsyncSocket Methode readDataWithTimeout gelesen. Mein Problem ist, dass nach 8-9 Sekunden, die Methode nicht mehr aufgerufen wird. Die Verbindung zum Server ist immer noch aktiv und der C # Server sendet immer noch Daten ..

, was ich tun möchte, ist die folgende Sache: -> winamp spielt ein Lied -> C # Server fragt winamp, welche Songs spielt er und schickt den Songtitel zu meiner App. -> iphone app empfängt die Daten und zeigt sie

Ich weiß nicht, warum die readDataWithTimeout Methode nicht mehr nach kurzer Zeit von time..Maybe weil die kurzen Zeit zwischen den Meldungen von dem C # Server gesendet genannt wird?

Danke, Sorin

War es hilfreich?

Lösung 2

ich machte es work..after ein wenig mehr lesen ... so Daten zu lesen, wenn es mit AsyncSocket auf unbekannte Abständen kommt ich den Brache-Code verwendet (ich weiß nicht, ob die beste Lösung ist, aber es funktioniert für das, was ich wollte):

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

ich rufe einmal in meiner Anwendung die readDataFromSocket Methode, die die Sockets ruft [Buchse readDataWithTimeout: -1 tag: 0] Methode. Es sollte nur ein einziges Mal in der App, weil bei dem Verfahren genannt werden - (void) onSocket: (AsyncSocket *) Socke didReadData: (NSData *) Daten withTag: (long) Tag-Methode in der letzten Zeile wieder rufe ich die [Buchse readDataWithTimeout: -1 tag: 0]; die erzählt die Buchse an der Steckdose zu hören. Wenn Daten der Steckdose ankommt wird es lesen.

hoffe, es hilft jemand ..

Andere Tipps

Mehrere Dinge hier. Erstens, warum tun dies jede Sekunde anstatt nur auf Song ändert? Das wird sehr teuer auf der iPhone Batterie sein, ständig auf diese Weise klappert. Es gibt wenig Grund, es auch auf einem Desktop zu tun.

Also, wenn ich das richtig verstehen, verbindet iPhone zu .NET und fragt nach dem Lied. .NET gibt den Song und verlässt Buchse offen. Jede Sekunde .NET schreibt an seiner Fassung, und jedes zweite iPhone liest aus der Fassung.

Was ich vermute, geschieht, ist, dass das Timeout auf dem readDataWithTimeout:tag: an einem gewissen Punkt nicht vor den nächsten NSTimer Brände (weder hat keine wirkliche Garantie darüber, wann es wird Feuer) nicht verfallen. Sie dann wahrscheinlich zwei bekommen readDataWithTimeout:tag: Anrufe zur gleichen Zeit ausgeführt wird, wahrscheinlich immer die Buchse delegieren verwirrt.

Die bessere Lösung ist eine „lange Umfrage.“ Auf der iPhone Seite, rufen readDataWithTimeout:tag: mit einer ziemlich langen Timeout (etwa 30-60s). Jedesmal, wenn er zurückkehrt, nur Schleife gleich wieder hinein:

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

Dann in -onSocketDidDisconnect: und -onSocket:willDisconnectWithError:, stellen Sie sicher, self.isRunning zu NO einzustellen. Lassen Sie sich ganz aus dem NSTimer los zu werden.

Ich würde immer noch nichts von der .NET-Seite veröffentlichen, bis Winamp Songs tatsächlich ändert, though. Senden Sie die gleichen Daten immer und immer wieder tun, keine Bevorzugungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top