Foros aprenderaprogramar.com

Aprender a programar => De todo un poco... => Mensaje iniciado por: DaniMir en 02 de Octubre 2017, 22:33

Título: Medición parametros rendimiento red Sockets java
Publicado por: DaniMir en 02 de Octubre 2017, 22:33
Buenas,

Estaba intentando desarrollar una aplicación en Android para comunicar dos dispositivos. Para ello hago uso de sockets y me gustaría saber como puedo medir en la propia app parámetros de rendimiento de la red como el ancho de banda, bits erróneos o paquetes fallidos.

Gracias.
Título: Re:Medición parametros rendimiento red Sockets java
Publicado por: César Krall en 24 de Octubre 2017, 18:11
Hola! Pregunta que se me escapa por compleja. Una idea para calcular el ancho de banda que estás obteniendo podría ser descargarte un archivo y medir el tiempo que ha tardado, y con eso hacer el cálculo de velocidad de transferencia.

La idea sería similar a este código (no probado):

Código: [Seleccionar]
//Download your image
long startTime = System.currentTimeMillis();
HttpGet httpRequest = new HttpGet(new URL(urlString).toURI());
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpClient.execute(httpRequest);
long endTime = System.currentTimeMillis();

HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity;
bufHttpEntity = new BufferedHttpEntity(entity);

//You can re-check the size of your file
final long contentLength = bufHttpEntity.getContentLength();

// Log
Log.d(TAG, "[BENCHMARK] Dowload time :"+(endTime-startTime)+" ms");

// Bandwidth : size(KB)/time(s)
float bandwidth = contentLength / ((endTime-startTime) *1000);

Saludos!
Título: Re:Medición parametros rendimiento red Sockets java
Publicado por: DaniMir en 28 de Octubre 2017, 18:11
Hola! En primer lugar gracias por contestar.

La aplicación se basa en la tecnología Wifi Direct. El problema que tengo es que es que al tratarse de dos dispositivos diferentes, al usar System.currentTimeMillis() , los relojes de ambos deberían estar sincronizados y no encuentro la manera de llevar esto a cabo.

Con el DMMS de Android Studio, hay una herramienta que es network statistics, que me muestran el tiempo y la velocidad(no son datos muy exactos ya que se remite a la grafica). No estoy muy seguro pero me parece que este tiempo hace referencia al tiempo que tarda en enviar, y tiempo que tarda en recibir, en lugar del tiempo que tarda en llegar el mensaje de un punto a otro, que es lo que a mí me interesaría,no se si me podeis aclarar esto.

En resumen lo que me interesa es medir ese tiempo que tarda desde un punto a otro teniendo en cuenta que son dos dispositivos diferentes.

Parte en la que envío:

Código: [Seleccionar]
socket.bind(null);
                   
                    socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT);
                    int tamMensaje= 1024*1024; // 1 MByte de tamano de mensaje
                    byte[] bitAleatorio = new byte [tamMensaje]; // 1 byte, de -128 a 127
                    for (int x=0;x<bitAleatorio.length;x++){
                        bitAleatorio[x] =(byte) Math.round(Math.random());
                    }

                    DataOutputStream DOS = new DataOutputStream(socket.getOutputStream());

                    for(int i=0;i<1024;i++){
                        DOS.write(bitAleatorio,(i*1024),1024);
                              }


Parte en la que recibo:

Código: [Seleccionar]
                            ServerSocket serverSocket = new ServerSocket(SERVERPORT);
                            Socket client = serverSocket.accept();
                            DataInputStream DIS = new DataInputStream(client.getInputStream());

                            int tamMensaje= 1024*1024;
                            byte[] msg_received2= new byte [tamMensaje];
                        for(int i=0;i<1024;i++){
                            DIS.read(msg_received2,(i*1024),1024);
                        }
                            client.close();
                            serverSocket.close();

Gracias.
Un saludo.