Receber vários byte[] - DatagramSocket

1 resposta
guisantogui

Bom pessoal eu já fiz um post aqui sobre enviar vários byte[], e isso eu já consegui, mas estou com problema na hora que eu recebo esses dados, pois estou enviando com os devidos cabeçalhos, numero do ACK, tamanho dos dados checksum e etc.

segue minha classe server e client:
Ahh, tem mais uma coisa, como eu faço um pacote ser re-enviado caso não feche o checksum?

SERVER:
public class Server {
    
    public void startSever(){
        try {
            DatagramSocket dataRec = new DatagramSocket(7777);
            Conversor conversor = null;
            byte[] dadosRecebidos = new byte[100];
            byte[] nroAck = new byte[2];
            byte[] tamanhoBy = new byte[2];
            byte[] nroSeqBy = new byte[2];
            byte[] checksum = new byte[8];
            while(true){
                DatagramPacket dp = new DatagramPacket(dadosRecebidos, dadosRecebidos.length);
                dataRec.receive(dp);
                
                byte[] pacote = dp.getData();
                
                System.out.println(new String(pacote));
                
                for(int i = 0; i < 2;i++){
                    nroSeqBy[i] = pacote[i];
                }
                
                int k = 2;
                for(int i = 0; i < 2; i++){
                    nroAck[i] = pacote[k];
                    k++;
                }
                
                for(int i = 0; i < 2; i++){
                    tamanhoBy[i] = pacote[k];
                    k++;
                }
                
                for(int i = 0; i < 51; i++){
                    dadosRecebidos[i] = pacote[k];
                    k++;
                }
                
                for(int i = 0; i < 8; i++){
                    checksum[i] = pacote[k];
                    k++;
                }
                
                conversor = new Conversor();
                conversor.getCrc().update(dadosRecebidos);
                // comparar CRC da parte dos dados com o crc que veio no modelo!
                if(conversor.getLong(checksum, 0, checksum.length) != conversor.getCrc().getValue()){
                    // mexer no Ack
                    // Fazer o treco para re-enviar o pacote
                }
                // Ver como verificar quando o arquivo foi enviado por completo
                
                
               // System.out.println(new String(dadosRecebidos));    
                
            }
            
        }
        catch (SocketException ex) {
            ex.printStackTrace();
        } 
        catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
}

CLIENT

public class Client {
    
    private Conversor converter = new Conversor("C:\Users\Guilherme\Desktop\arqTeste.txt");
    
    public void enviarDados(){
        try {
            byte[] dados = converter.converteFileToByteArray();
            DatagramSocket dataSend = new DatagramSocket();
            InetAddress IPAddress = InetAddress.getByName("localhost");
            DatagramPacket sendPacket = null;
            List<byte[]> enviar = null;
            int i = 0;
            do{
                enviar = converter.montaCabecalhos(converter.montaArray50Bytes(dados));
                sendPacket = new DatagramPacket(enviar.get(i), enviar.get(i).length, IPAddress, 7777);
                dataSend.send(sendPacket);
                i++;
            }
            while(i < enviar.size());
            dataSend.close();
            
        }
        catch (SocketException ex) {
            ex.printStackTrace();
        }
        catch (UnknownHostException ex) {
            ex.printStackTrace();
        }
        catch (IOException ex) {
                Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

1 Resposta

ViniGodoy

Crie um Map com o Id do pacote e o pacote enviado. Envie novamente o pacote caso o ACK não chegue, após um determinado Timeout. Descarte o objeto do map caso o ACK chegue.

Você leu sobre o protocolo de janelas deslizantes que comentei no outro tópico?

Criado 18 de junho de 2011
Ultima resposta 19 de jun. de 2011
Respostas 1
Participantes 2