iPhone / iPod получают сообщения с сервера C # tcpip с помощью CocoaAsyncSocket

StackOverflow https://stackoverflow.com/questions/798408

  •  18-09-2019
  •  | 
  •  

Вопрос

я пытаюсь отправить / получить данные по Wi-Fi в приложение iphone / ipodtouch с сервера C # tcpip.для этого я использовал CocoaAsyncSocket из проекта Google.Если я нажимаю кнопку и отправляю запрос с ipod на сервер, он возвращает запрошенные данные (например, название песни)..я хочу каждую секунду знать, что это за песня playng...so с сервера C # я отправляю сообщения в свое приложение с интервалом в 1 секунду.В моем приложении по таймеру с интервалом в 1 секунду я вызываю метод AsyncSocket read readDataWithTimeout.Моя проблема в том, что через 8-9 секунд этот метод больше не вызывается.Соединение с сервером все еще активно, и сервер C # по-прежнему отправляет данные..

то, что я хочу сделать, это следующее:-> winamp воспроизводит песню -> Сервер C # запрашивает winamp, какие песни он воспроизводит, и отправляет название песни в мое приложение.-> приложение iphone получает данные и отображает их

я не знаю, почему метод readDataWithTimeout больше не вызывается через короткий промежуток времени..Может быть, из-за короткого промежутка времени между сообщениями, отправленными сервером C #?

Спасибо тебе, Сорин

Это было полезно?

Решение 2

у меня получилось ... еще немного почитав...итак, чтобы считывать данные, когда они поступают с помощью AsyncSocket с неизвестными интервалами, я использовал код fallowing (я не знаю, лучшее ли это решение, но оно работает для того, что я хотел):

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

я вызываю один раз в своем приложении метод readDataFromSocket, который вызывает метод sockets [socket readDataWithTimeout:-1 tag:0].Он должен вызываться только один раз в приложении, потому что в методе - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data с тегом:(long)метод тега в последней строке я снова вызываю [socket readDataWithTimeout:-1 tag:0];который сообщает сокету о прослушивании сокета.Когда данные поступят, сокет их прочитает.

надеюсь, это кому-то поможет..

Другие советы

Здесь есть несколько вещей.Во-первых, зачем делать это каждую секунду, а не только при смене песни?Это будет очень дорого стоить для аккумулятора iPhone, чтобы постоянно болтать таким образом.Нет особых причин делать это даже на рабочем столе.

Итак, если я правильно понимаю, iPhone подключается к .NET и запрашивает песню..NET возвращает песню и оставляет сокет открытым.Каждую секунду .NET записывает данные в свой сокет, и каждый второй iPhone считывает данные из своего сокета.

Что, как я подозреваю, происходит, так это то, что в какой-то момент истекает тайм-аут на readDataWithTimeout:tag: срок действия не истекает до срабатывания следующего NSTimer (также нет никакой реальной гарантии относительно того, когда он сработает).Тогда вы, вероятно, получите два readDataWithTimeout:tag: вызовы, выполняемые в одно и то же время, вероятно, сбивают с толку делегата сокета.

Лучшим решением является "длительный опрос". На стороне iPhone вызовите readDataWithTimeout:tag: с довольно длительным таймаутом (скажем, 30-60 секунд).Каждый раз, когда он возвращается, просто возвращайтесь к нему:

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

Затем в -onSocketDidDisconnect: и -onSocket:willDisconnectWithError:, обязательно установите self.isRunning Для NO.Полностью избавьтесь от NSTimer.

Я бы все равно ничего не публиковал со стороны .NET, пока Winamp на самом деле не изменит песни.Отправка одних и тех же данных снова и снова не приносит никакой пользы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top