Stavo testando un HTTP servlet implementation (kindly shared by BalusC) che supporta HTTP byte range requests.Comportamento del client del protocollo dell'intervallo di byte HTTP su iPad/iPhone
Ho trovato alcune differenze particolari tra diversi client HTTP e mi chiedevo se non mi mancasse nulla. Ho usato un file video> 2G mp4 per i miei test e stavo catturando pacchetti con Wireshark. Questo è più o meno ciò che accade:
Samsung Galaxy SII:
- richiesta HTTP GET per il file viene chiedendo intervallo di byte
[0; <almost the end of the file>]
- server risponde, dello streaming il file
ogni successivo chunk viene servito entro i limiti della stessa risposta HTTP. Nessuna nuova richiesta HTTP viene inviata (a meno che il video non venga inoltrato rapidamente a una determinata posizione). Codice Streaming pezzo di questo è abbastanza semplice, si legge
RandomAccessFile input
e scriveOutputStream output
viabyte[] buffer
:while ((read = input.read(buffer)) > 0) { output.write(buffer, 0, read); }
- richiesta HTTP GET per il file viene chiedendo intervallo di byte
- iPad 1
- richiesta HTTP GET per il file viene chiedendo intervallo di byte
[0; <almost the end of the file>]
- server risponde, avvia lo streaming del file
- L'iPad riceve un blocco o due e quindi decide unilateralmente di interrompere l'accettazione dei byte dal server ed emette un numero separata
GET
richiesta per il blocco successivo del file. Nuovi limiti di intervallo sono ad es.[100, almost the end of the file]
. Il video è mostrato OK. - il ciclo si ripete nuovamente dal passaggio 2. Il limite sinistro si sposta sempre verso la fine del file.
- richiesta HTTP GET per il file viene chiedendo intervallo di byte
Io non indagare su come esattamente la connessione viene terminata. Potrebbe essere che l'iPad interrompa l'invio di pacchetti TCP ACK, suppongo che questo non abbia molta importanza.
Il mio problema è che per ogni connessione terminata ottengo l'eccezione java.net.SocketException: Broken pipe
. Ciò non solo inquina i registri (che è un problema minore/risolvibile) ma ritengo che ciò possa compromettere le prestazioni poiché l'aumento delle eccezioni è piuttosto costoso. Quando si guardava un video semplice, il tasso di eccezione era di circa 1 eccezione/sec, ma se il server aveva 100 utenti simultanei, la JVM probabilmente impiegava molto tempo a calcolare le tracce dello stack invece di fare il vero lavoro.
ho anche testato questo su iPhone utilizzando iOS 6 ed è stato in grado di osservare lo stesso comportamento di iPad 1. Giusto per ribadire, questa non accade su Samsung Android né browser desktop che ho provato, tra cui Safari su un Mac desktop.
Domande:
- questo è un sapere bug/caratteristica di iPad/iPhone?
- esiste una soluzione alternativa?
Trovato [la stessa domanda posta da qualcun altro] (https://groups.google.com/forum/#!msg/youtube-api-gdata/V6RU2h9afBg/ibaJ7yOHjBAJ), così come [ un altro] (http://stackoverflow.com/questions/6094556/mobile-safari-makes-multiple-video-requests), purtroppo nessuna risposta utile finora :( – mindas