Pregunta

Estoy tratando de enviar / recibir datos a través de WiFi a una aplicación para el iPhone / iPod Touch desde un servidor de C # TCPIP. para ello he utilizado cocoaAsyncSocket del proyecto de Google. Si i apretar un botón y de que envíe una solicitud desde el iPod al servidor devuelve los datos solicitados (título de la canción, por ejemplo) .. Quiero saber cada segundo la canción que está playng ... por lo que desde el servidor C # i enviar a intervalos de 1 segundo mensajes a mi aplicación. En mi aplicación en un temporizador con el intervalo de 1 segundo que llamo el AsyncSocket leer readDataWithTimeout método. Mi problema es que después de 8-9 segundos que el método no se llama más. La conexión con el servidor todavía está activo y el servidor de C # todavía envía los datos ..

lo que quiero hacer es lo siguiente: -> Winamp reproduce una canción -> C # servidor pide winamp las canciones que está jugando y envía el título de la canción a mi aplicación. -> aplicación iPhone recibe los datos y lo muestra

No sé por qué el método readDataWithTimeout no se llama más después de un corto período de time..Maybe porque el poco tiempo entre los mensajes enviados por el servidor de C #?

Gracias, Sorin

¿Fue útil?

Solución 2

lo hice work..after un poco más de lectura ... de modo que leer datos cuando se llega con AsyncSocket en intervalos desconocidos He utilizado el código de barbecho (no sé si es la mejor solución, pero funciona para lo lo que quería):

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

i llamo una vez en la aplicación del método readDataFromSocket que llama a las tomas de enchufe [readDataWithTimeout: -1 etiqueta: 0] método. Debería llamarse sólo una vez en la aplicación debido a que en el método - (void) onSocket: (AsyncSocket *) didReadData calcetín: (NSData *) withTag datos: (largo) método de la etiqueta en la última línea que yo llamo de nuevo el [readDataWithTimeout socket: -1 etiqueta: 0]; el cual indica al conector para escuchar en el zócalo. Cuando llega la toma de datos lo leerá.

espero que ayude a alguien ..

Otros consejos

Hay varias cosas aquí. En primer lugar, ¿por qué hacer esto cada segundo en lugar de sólo en los cambios de la canción? Esto va a ser muy costoso en la batería del iPhone a charlar constantemente de esta manera. Hay pocas razones para hacerlo incluso en un escritorio.

Así que si he entendido bien, el iPhone se conecta a .NET y pide la canción. .NET devuelve el canto y deja socket abierto. Cada segundo, .NET escribe a su zócalo, y cada segundo iPhone lee de su zócalo.

Lo que sospecho que está sucediendo es que en algún momento el tiempo de espera en la readDataWithTimeout:tag: no expira antes de las próximas incendios NSTimer (ni tiene ninguna garantía real sobre cuándo va a disparar). A continuación, probablemente se produzcan dos llamadas readDataWithTimeout:tag: funcionando al mismo tiempo, probablemente conseguir el delegado toma confundirse.

La mejor solución es un "sondeo de largo." Por el lado de iPhone, llame readDataWithTimeout:tag: con un tiempo de espera bastante largo (30-60 digamos). Cada vez que vuelve, el lazo apenas a la derecha de nuevo en ella:

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

A continuación, en -onSocketDidDisconnect: y -onSocket:willDisconnectWithError:, asegúrese de establecer self.isRunning a NO. Deshacerse de la NSTimer por completo.

Me sigue sin publicar nada desde el lado .NET hasta Winamp realmente cambia las canciones, sin embargo. El envío de los mismos datos una y otra vez no hace ningún favor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top