Задержка асинхронного сокета

Поэтому я пишу приложение для своего iphone, которое подключается к моему компьютеру, на котором запущено java-приложение с использованием AsyncSocket. На стороне Java он должен распечатать «ОК», когда iPhone подключается к серверу. Я также добавил команду sleep() на сторону iphone, поэтому после подключения к серверу он отправляет некоторые данные, а затем засыпает на 5 секунд. Но на стороне java все данные, включая «ОК», и данные распечатываются ПОСЛЕ команды sleep. Так что это похоже на то, что iphone не подключается до тех пор, пока не завершится выполнение программы. Кто-нибудь может мне помочь? Спасибо...


person Deniz O    schedule 25.06.2010    source источник


Ответы (2)


AsyncSocket предназначен для того, чтобы «выстрелил и забыл». Вы не должны ждать, пока что-то произойдет. Вся цель этого класса состоит в том, чтобы делать свою работу в фоновом режиме, а затем уведомлять вас, когда это будет сделано.
Если вам нужен блокирующий сокет, вы должны использовать что-то еще.

person Romain Hippeau    schedule 25.06.2010

Причина, по которой вы видите эту проблему, заключается в том, что AsyncSocket выполняется асинхронно в цикле выполнения, но когда вы вызываете sleep(), вы блокируете цикл выполнения, в котором пытается выполнить AsyncSocket.

При вызове [asyncSocket connectToHost:...] метод немедленно возвращается, и попытка подключения продолжается в фоновом режиме. Метод делегата уведомит вас об установлении соединения. Но код, завершающий настройку соединения (внутри AsyncSocket), также должен выполняться в цикле выполнения.

Точно так же, когда вы вызываете [asyncSocket writeData:...], метод возвращается немедленно. Код, отправляющий эти данные, планируется запустить в цикле выполнения сокета. Но если вы вызовете sleep(), вы предотвратите запуск этого кода.

person Robbie Hanson    schedule 07.05.2011