2014-10-15 8 views
5

Sto usando webSockets per connettere un client webSocket javascript a un webserver Java java (da un'applicazione Android), utilizzando la libreria Java-WebSocket. L'app Android invia un piccolo messaggio ogni pochi millisecondi al client javascript.Il modo migliore per evitare gli effetti dell'algoritmo Nagle usando webSockets?

Utilizzando l'approccio di base (e intuitivo) per questa situazione, il ritardo tra i messaggi ricevuti, misurato all'interno del client javascript mostra (approssimativamente) il seguente schema: 200 ms, 0,1 ms, 0,1 ms, 0,1 ms, 0,1 ms , 0,1 ms, 0,1 ms, 200 ms, 0,1 ms, 0,1 ms, 0,1 ms, 0,1 ms, 0,1 ms, 0,1 ms, 200 ms, 0,1 ms, 0,1 ms, 0,1 ms, 0,1 ms, 0,1 ms, 0,1 ms ..

Questo è l'effetto dell'algoritmo Nagle, impostato per impostazione predefinita, che raggruppa diversi messaggi prima di inviarli.

Dal momento che non ho trovato un modo per garantire la sua disattivazione, seguo l'approccio proposto in this vecchia questione, l'invio di un riconoscere messaggio dal client al server, e il sistema si comporta correttamente, ma dal momento che il messaggio di riconoscimento non ha scopo reale (è più un hack), dovrebbe essere evitato.

La domanda è, questa continua a essere la migliore soluzione a questo problema? Conosci qualche modo per evitare l'aggregazione?

Grazie.

+0

In .NET è presente un'impostazione nell'oggetto socket per disabilitare l'algoritmo di Nagle, probabilmente c'è qualcosa di simile in Java. – vtortola

+0

C'è un metodo '.flush()' sul socket che puoi chiamare dopo averlo scritto? – jfriend00

+1

Hai ['setTcpNoDelay()'] (http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setTcpNoDelay (booleano)) disponibile nella libreria? – jfriend00

risposta

0

Poiché nessun meccanismo di flush o setTCPNoDelay sembra essere presente nella libreria utilizzata e non sono state proposte altre soluzioni, sembra che la soluzione del messaggio di conferma resti valida come la migliore soluzione a questo problema.