2010-08-20 18 views
5

Qualcuno ha qualche consiglio su come calcolare l'utilizzo della larghezza di banda di un socket?Calcolo della larghezza di banda dei dati inviati/ricevuti tramite un socket?

Ad esempio, quando invio dati tramite un socket al server a cui sono connesso, voglio mostrare i Kb/s che vengono inviati.

La ricerca Google non ha rivelato nulla di utile. Forse sto cercando i termini sbagliati.

+0

Questo articolo potrebbe darvi alcune idee: http://www.roseindia.net/javatutorials/counting_bytes_on_sockets.shtml – darri

risposta

5

Il meglio che probabilmente riuscirai a facilmente do è registrare quando inizi a scrivere e quindi contali i byte che hai inviato con successo al metodo Socket.getOutputStream.write(). Per una piccola quantità di dati, ciò sarà molto impreciso in quanto si tratta solo di riempire il buffer di trasmissione del sistema operativo che inizialmente prenderà byte molto più velocemente di quanto non li invii effettivamente.

Tuttavia, dovrebbe ammortizzare sostanzialmente la velocità corretta su una quantità piuttosto grande di dati.

+0

Ciò funzionerebbe in teoria, ma non fornirebbe una rappresentazione molto accurata della velocità di trasferimento all'attuale momento. Ad esempio: se stavo registrando per 5 minuti ... ho trascorso i primi 2,5 minuti senza fare nulla e gli ultimi 2,5 minuti a inviare 100kb/s. Alla fine dei 5 minuti mi direbbe che la velocità era media di 50kb/s. Non sto cercando la velocità media da quando ho iniziato a trasmettere. Sto cercando la velocità attuale. Forse la media degli ultimi 5 secondi funzionerebbe, ma non ho idea di registrare qualcosa del genere. –

+1

Questa è chiamata media mobile: http://en.wikipedia.org/wiki/Moving_average. È abbastanza semplice da calcolare anche se ci sono vari metodi. Non c'è davvero niente come calcolare la larghezza di banda in un dato momento; dato che i dati sono discreti devi avere una media. Un metodo estremamente semplice sarebbe 'average = (average + new_measurement_average)/2.0'. –

+2

Nota: [CountingOutputStream] di Guava (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/CountingOutputStream.html) rende molto semplice il wrapping di un flusso di output con un altro stream che conta il numero di byte che ha scritto. –

Problemi correlati