Programa UDP - Inconsistencia no tempo de envio

1 resposta
metanolbr

Oi galera, é o seguinte, desenvolvi um programa client/server para enviar/receber dados utilizando o protocolo UDP e medir a média e o desvio padrão do tempo que levou. Envio de 1 à 8192 bytes, 1, 2, 4, 8, etc… (exponencial de 2), porém o que está acontecendo é que o tempo não está consistente, o quero dizer é que quantidades menores de bytes deveria levar menos tempo que quantidade maiores de bytes para chegar, porém observei que tal comportamento não está acontecendo, na verdade o tempo não está seguindo um padrão.
Não sei se estou enviando corretamente a quantidade de bytes. Segue abaixo o código utilizado no Client e no Servidor. Já tentei de tudo porém não consigo valores consistentes, alguém saberia identificar onde está o problema? Desde já agradeço, metanolbr

Servidor:

import java.io.*;
import java.net.*;

public class UDPServer {

    public static void main(String args[]) {

        byte[] receiveData = new byte[8192];
        byte[] sendData = {1};

        try {

            // cria socket do servidor com a porta 9876
            DatagramSocket serverSocket = new DatagramSocket(9876);



            for (int i = 0; i < 14000; i++) {
                // declara o pacote a ser recebido
                DatagramPacket receivePacket =
                        new DatagramPacket(receiveData,
                        receiveData.length);

                // recebe o pacote do cliente
                serverSocket.receive(receivePacket);

                // pega os dados, o endereço IP e a porta do cliente
                // para poder mandar a msg de volta
                InetAddress IPAddress =
                        receivePacket.getAddress();
                int porta = receivePacket.getPort();

                // monta o pacote com enderço IP e porta
                DatagramPacket sendPacket =
                        new DatagramPacket(sendData, sendData.length,
                        IPAddress, porta);

                // envia ao cliente
                serverSocket.send(sendPacket);
            }
        } catch (IOException e) {
            System.out.println("Problemas no Servidor");
            e.printStackTrace();
        }

    }
}

Client

import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.*;
import org.apache.commons.math.stat.descriptive.*;

public class UDPClient {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        byte[] sendData;
        byte[] receiveData;
        ArrayList vetorTempo;
        DescriptiveStatistics stats;
        BufferedReader entradaTeclado =
                new BufferedReader(new InputStreamReader(System.in));

        try {
            DatagramSocket clientSocket = new DatagramSocket();

            System.out.print("Digite o hostname da maquina que deseja acessar: ");
            String hostname = entradaTeclado.readLine();

            InetAddress IPAddress = InetAddress.getByName(hostname);
            Date data = new Date(System.currentTimeMillis());
            SimpleDateFormat formatarData = new SimpleDateFormat("yyyyMMddHHmm");

            FileWriter arquivoResultado = new FileWriter("resultado" + formatarData.format(data) + ".csv");
            BufferedWriter out = new BufferedWriter(arquivoResultado);


            out.write("UDP,");
            out.write("MED,");
            out.write("DVP\n");

            for (int qtdBytes = 1; qtdBytes <= 8192; qtdBytes = qtdBytes * 2) {
                vetorTempo = new ArrayList();
                sendData = new byte[qtdBytes];
                receiveData = new byte[1];
                stats = new DescriptiveStatistics();

                long tempoInicial;
                long tempoFinal;
                long tempoTotal = 0;

                double mediaTempo = 0;
                double desvioPadrao = 0;

                System.out.println("\nBYTES: " + qtdBytes);

                for (int rodada = 0; rodada < 10; rodada++) {
                    System.out.println("Rodada: " + rodada);


                    for (int rtt = 0; rtt < 100; rtt++) {
                        DatagramPacket sendPacket =
                                new DatagramPacket(sendData, sendData.length, IPAddress, 9009);

                        DatagramPacket receivePacket =
                                new DatagramPacket(receiveData, receiveData.length);

                        tempoInicial = System.currentTimeMillis();

                        clientSocket.send(sendPacket);
                        clientSocket.receive(receivePacket);

                        tempoFinal = System.currentTimeMillis();
                        tempoTotal = tempoFinal - tempoInicial;

                        System.out.println("RTT " + rtt + ": " + tempoTotal + " ms.");

                    }

                    vetorTempo.add(tempoTotal);
                    stats.addValue(tempoTotal);

                }
                mediaTempo = stats.getMean();
                desvioPadrao = stats.getStandardDeviation();
                out.write(qtdBytes + "," +
                        mediaTempo + "," +
                        desvioPadrao + "\n");
                System.out.println("Quantidade de bytes: " + qtdBytes + " Média de Tempo: " + mediaTempo +
                        "\nDesvio Padrão: " + desvioPadrao);
            }

            out.close();
            clientSocket.close();
        } catch (IOException e) {
            System.out.println("Problemas no Cliente:");
            e.printStackTrace();
        }
    }
}

1 Resposta

pablosaraiva

Veja bem.

8k é muito pouco.

Quando esses bytes que você está enviando são encapsulados por todos as camadas no caminho, pode ser que 1 byte e 8k bytes não tenham mesmo grande diferença no tempo de envio com as conexões rápidas de hoje.

Até porque você está colocando tudo em um buffer só e fazendo o envio. Poderia até fazer diferença se você enviasse 1 a 1.

O server também recebe tudo de uma vez só num buffer de 8k.

Minha sugestão é: Envie mais informação, em mais de um pacote e aí sim você vai ter alguns dados pra trabalhar na sua medida de tempo.

Criado 12 de dezembro de 2009
Ultima resposta 16 de dez. de 2009
Respostas 1
Participantes 2