iPhone / iPod receber mensagens de C servidor # tcpip usando CocoaAsyncSocket
-
18-09-2019 - |
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
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.