Pergunta

eu estou tentando enviar / receber dados através de Wi-Fi para um aplicativo para iPhone / iPod Touch a partir de um servidor C # tcpip. para isso eu usei cocoaAsyncSocket do projeto do Google. Se eu apertar um botão e eu enviar um pedido do iPod para o servidor retorna os dados solicitados (título da música, por exemplo) .. eu quero saber a cada segundo que música é playng ... então através de um servidor C # i enviar em intervalos de 1 segunda mensagens para meu aplicativo. Em meu aplicativo em um temporizador com o intervalo de um segundo eu chamo o asyncSocket ler método readDataWithTimeout. Meu problema é que depois de 8-9 segundos que o método não é chamado anymore. A conexão com o servidor ainda está ativo e o servidor C # ainda envia dados ..

o que eu quero fazer é o seguinte: -> Winamp toca uma música -> C servidor # pede winamp quais músicas ele está jogando e envia o título da canção para meu aplicativo. -> iphone app recebe os dados e exibe-lo

Eu não sei por que o método readDataWithTimeout não é chamado mais depois de um curto período de time..Maybe porque o curto espaço de tempo entre as mensagens enviadas pelo servidor C #?

Obrigado, Sorin

Foi útil?

Solução 2

i fez work..after um pouco mais lendo ... então para ler os dados quando ele chega com AsyncSocket em intervalos desconhecidos eu usei o código de vazio sanitário (i não sei se é a melhor solução, mas funciona para o que eu queria):

- (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 chamar uma vez na minha aplicação do método readDataFromSocket que chama os soquetes [soquete readDataWithTimeout: -1 tag: 0] método. Ele deve ser chamado apenas uma vez no aplicativo porque no método - (void) onSocket: (AsyncSocket *) meia didReadData: (NSData *) withTag dados: (longo) método tag na última linha i chamar novamente o [tomada readDataWithTimeout: -1 tag: 0]; que informa o soquete para escutar no socket. Quando os dados chegam a tomada vai lê-lo.

espero que ajude alguém ..

Outras dicas

Várias coisas aqui. Primeiro, por que fazer isso a cada segundo ao invés de apenas sobre as mudanças canção? Isso vai ser muito caro na bateria do iPhone a bater constantemente desta forma. Há pouca razão para fazê-lo, mesmo em um ambiente de trabalho.

Então, se eu entendi corretamente, o iPhone se conecta ao .NET e pede para a canção. .NET retorna a música e as folhas soquete aberto. A cada segundo, .NET grava em seu soquete, e cada segundo iPhone lê de seu soquete.

O que eu suspeito que está acontecendo é que em algum momento o tempo limite no readDataWithTimeout:tag: não expira antes das próximas incêndios NSTimer (nem tem qualquer garantia real sobre quando ele vai disparar). Você, então, provavelmente terá duas chamadas readDataWithTimeout:tag: em execução ao mesmo tempo, provavelmente recebendo o delegado tomada confuso.

A melhor solução é uma "longa pesquisa." No lado do iPhone, readDataWithTimeout:tag: chamada com um longo tempo de espera (dizem 30-60s). Cada vez que ele retorna, apenas loop de volta para a direita nele:

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

Então, em -onSocketDidDisconnect: e -onSocket:willDisconnectWithError:, certifique-se de conjunto self.isRunning para NO. Livrar-se do NSTimer inteiramente.

Eu ainda não qualquer post de lado o .NET até Winamp realmente muda canções, no entanto. Enviando os mesmos dados repetidamente não faz nenhum favor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top