iPhone / iPod получают сообщения с сервера C # tcpip с помощью CocoaAsyncSocket
-
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 на самом деле не изменит песни.Отправка одних и тех же данных снова и снова не приносит никакой пользы.