2011-12-01 10 views
5

Mi sto connettendo da un dispositivo Android utilizzando java a un server che esegue PHP utilizzando DefaultHttpClient.Rileva timeout connessione java client Android da PHP

Un test che sto facendo è verificare che il codice java si maneggi correttamente se il server impiega molto tempo a inviare dati indietro. Se richiede troppo tempo, si disconnette e riprova.

Attualmente Ho installato il timeout di connessione a 3 secondi da:

HttpConnectionParams.setSoTimeout(httpParameters, 3000); 

Sul server script PHP sta dormendo per 10 secondi:

sleep(10); 

il codice Java funziona, se lo script richiede più di 3 secondi, quindi lancia una java.net.SocketTimeoutException e poi riprova nuovamente dopo un breve periodo di tempo.

Lo script PHP continua a funzionare che è non quello che voglio. Ho provato a provare usando connection_aborted subito dopo la funzione sleep ma non cattura la disconnessione del client che è già successo.

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

Qual è il modo consigliato di gestirlo?

+0

Che cosa significa il relativo codice php assomigliare? – Phil

+0

@Phil una linea semplice per dormire per 10 secondi. – zaf

+0

@Phil Ho aggiunto il mio tentativo con connection_aborted – zaf

risposta

0

Non sono sicuro se è lo stesso ora, ma molto tempo fa mi sono imbattuto in php non rendendomi conto che la connessione è stata interrotta fino a quando non ha effettivamente provato a scrivere o svuotare i suoi buffer di uscita. Vedi php's flush() e ob_flush(); Non avevo bisogno di scrivere realmente qualcosa per l'output, bastava svuotare i buffer vuoti per farlo controllare.

Immagino che i server web e altre cose di fronte a php possano influenzare questo comportamento.

Probabilmente è necessario aver già chiamato ignore_user_abort (true); in caso contrario php probabilmente interromperà l'esecuzione della chiamata a flush() (il comportamento predefinito è quello di fermarsi quando si realizza che la connessione è stata interrotta), quindi l'istruzione if non verrà mai eseguita.

+0

Sì, sembra indicare il fatto che il semplice script di sospensione non ha emesso nulla. Vediamo se una chiamata per lo svuotamento prima che la funzione connection_abort lo inneschi. – zaf

+0

Il mio tentativo non è riuscito. Vedi la mia domanda con il codice aggiornato. – zaf

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

In realtà, non si potrebbe pensare che che avrebbe funzionato, perché richiederebbe lo script php per arrivare a quel punto nello script. Se lo hai scritto alla fine, allora lo script deve seguire il suo corso.

vorrei suggerire invece:

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 
} 

fare un tentativo. Chiaramente stai cercando di dormire per 10 secondi e poi uccidi lo script ... in tutti i casi lo script verrà eseguito per 10 secondi.

2

In realtà ho scritto un articolo su questo argomento non molto tempo fa, darò una breve risposta qui e suppongo che sia anche corretto pubblicare un collegamento correlato?

In sostanza, PHP può solo capire che un client remoto si è disconnesso quando tenta di utilizzare il socket connesso a quel socket remoto, finché non gli si chiede di fare qualcosa con quel socket si suppone che tutto sia a posto.Ecco il codice che uso per verificare la presenza di sconnessioni remoti:

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

La parte importante qui è la MSG_PEEK ferma messaggi in sospeso vengano eliminato, e il simbolo "@" silenzia errori se la presa è ok, ma nessun messaggio sono in sospeso.

Per l'articolo completo, è disponibile qui:

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

saluti, Phil,

+0

Bel articolo da leggere e grazie per la risposta. Ho già eliminato il codice, quindi potrebbe volerci un po 'di tempo per testare le tue idee. – zaf