Обнаружение тайм-аута подключения клиента Java к Java

Я подключаюсь к устройству Android с помощью java на сервере с PHP, используя DefaultHttpClient.

Один из тестов, который я делаю, – проверить, что код java изящно обрабатывает себя, если сервер занимает много времени при отправке данных. Если это займет много времени, он отключается и повторяет попытку.

В настоящее время я установил таймаут соединения на 3 секунды:

HttpConnectionParams.setSoTimeout(httpParameters, 3000); 

На сервере скрипт PHP спящий на 10 секунд:

 sleep(10); 

Код java работает, если сценарий занимает больше 3 секунд, тогда он выдает исключение java.net.SocketTimeoutException и затем снова повторяет попытку через небольшое количество времени.

Сценарий PHP продолжает выполняться, что не то, что я хочу. Я пробовал тестирование с помощью connection_aborted сразу после функции сна, но он не улавливает отключение клиента, которое уже произошло.

 ignore_user_abort(true); sleep(10); print "black hole"; flush(); if(connection_aborted()!=0){ // You would think this works but it does not. } 

Какой рекомендуемый способ справиться с этим?

Я на самом деле написал статью по этому вопросу не так давно, я дам здесь короткий ответ и предположим, что также можно опубликовать связанную ссылку?

По сути, PHP только выяснит, что удаленный клиент отключился, когда он пытается использовать сокет, который подключен к этому удаленному сокету, пока вы не попросите его что-либо сделать с этим сокетом, он предположит, что все в порядке. Вот код, который я использую для проверки удаленных отключений:

 public function isAlive(){ $res = @socket_recv($this->sockHandle, $data, 1024, MSG_PEEK); if($res === 0){ return false; }else{ return true; } } 

Важная часть здесь – MSG_PEEK останавливает любые отложенные сообщения от очистки, а «@» отключает ошибки, если сокет в порядке, но сообщения не ожидаются.

Для полной статьи он доступен здесь:

http://www.bracketbrotherhood.com/remote-disconnections-php-non-blocking-server-sockets/programming-and-development/

С уважением, Фил,

Не уверен, что это то же самое сейчас, но давным-давно я столкнулся с php, не понимая, что соединение было прервано до тех пор, пока оно не попыталось написать или сбросить выходные буферы. Смотрите php's flush () и ob_flush (); Мне не нужно было ничего писать на выходе, просто очистить пустые буферы было достаточно, чтобы проверить.

Я бы предположил, что веб-сервер (ы) и другие вещи перед php могут повлиять на это поведение.

Вероятно, вам уже нужно было вызвать ignore_user_abort (true); В противном случае php, вероятно, остановит выполнение при вызове flush () (поведение по умолчанию должно прекратиться, когда оно понимает, что соединение ушло), поэтому ваш оператор if никогда не будет выполнен.

 print "black hole"; flush(); if(connection_aborted()!=0){ // You would think this works but it does not. } 

На самом деле, вы бы не подумали, что это сработает, потому что это потребует, чтобы PHP-скрипт дошел до этой точки в сценарии. Если вы написали его в конце, тогда скрипт должен пройти курс.

Вместо этого я бы предложил:

 for($i=0;$i<10;$i++){ echo ' '; ## echo "\0"; might also work flush(); if(connection_aborted()!=0){ // You would think this works but maybe it will now. die(); } sleep(1); # the sleep should come after the check } 

Попробуй. Ясно, что вы пытаетесь спать в течение 10 секунд, а затем убиваете скрипт … во всех случаях этот скрипт будет работать в течение 10 секунд.