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