Autor Tema: Medición parametros rendimiento red Sockets java  (Leído 4341 veces)

DaniMir

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Medición parametros rendimiento red Sockets java
« 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.

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Medición parametros rendimiento red Sockets java
« Respuesta #1 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!
Responsable de departamento de producción aprenderaprogramar.com

DaniMir

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Re:Medición parametros rendimiento red Sockets java
« Respuesta #2 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.
« Última modificación: 28 de Octubre 2017, 18:13 por DaniMir »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".