Metodo bind() - DatagramSocket

Gente tenho que fazer uma espécie de FTP para um trabalho da faculdade usando a classe DatagramSocket.

Então tenho a minha classe cliente que envia os dados e uma servidor que recebe (clássico), o envia parece estar funcionando ok, mas o recebe está travando e rodando infinitamente, pls, podem dar uma olhada no código?

Classe Client -

[code]public class Client {

private Conversor converter= new Conversor();

public void enviarDados(byte[] dados){
    try {
        DatagramSocket dataSend = new DatagramSocket();
        
        InetAddress IPAddress = InetAddress.getByName("localhost");
        
        DatagramPacket sendPacket = null;
        
        int i;
        List<byte[]> bytes = converter.montaArray50Bytes(dados);
        for(i = 0; i < bytes.size(); i++){
            sendPacket = new DatagramPacket(bytes.get(i), bytes.get(i).length, IPAddress, 7777);
            dataSend.send(sendPacket);
        }
    }
    catch (SocketException ex) {
        ex.printStackTrace();
    }
    catch (UnknownHostException ex) {
        ex.printStackTrace();
    }
    catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
    }
    
}

}[/code]

Server

[code]
public class Server {

private JanelaSaida js = new JanelaSaida();

public void startSever(){
    try {
        DatagramSocket dataRec = new DatagramSocket(7777);
        System.out.println("USE OS DADOS!");
        byte[] dadosRecebidos = new byte[1024];
        System.out.println("USE DADO");
        while(true){
            DatagramPacket dp = new DatagramPacket(dadosRecebidos, dadosRecebidos.length);
            System.out.println("USE ");
            dataRec.receive(dp);
            System.out.println("DADOS");
            byte[] bytes = dp.getData();
            System.out.println("USE OS DADOS");


            /*ImageIcon ic = new ImageIcon(bytes);
            js.setVisible(true);
            js.getLblImg().setIcon(ic);*/

        }
    }
    catch (SocketException ex) {
        ex.printStackTrace();
    }
    catch (IOException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    }
    
}

}[/code]

metodos usados da classe Conversor:

/** * Algoritmo recebe array de bytes e retorna uma lista com vários array de bytes com tamanho 50 cada array * @param array de bytes * @return uma lista com vários array de bytes com tamanho 50 cada array */ public List<byte[]> montaArray50Bytes(byte[] b){ List<byte[]> bytesLs = new ArrayList<byte[]>(); if(b.length <= 50){ bytesLs.add(b); } else{ int length = b.length; byte[] baux = new byte[50]; int j = 0; for(int i = 0; i >= length; i++){ baux[i] = b[j]; j++; if(i == 50){ i = 0; length -= 50; } if(length < 50 && length > 0){ byte[] bauxi = new byte[length]; int k; for(k = 0; k < length; k++){ bauxi[k] = b[j]; j++; bytesLs.add(bauxi); } length -= k; } bytesLs.add(baux); } } return bytesLs; }

/** * * @return byte[] com dados sobre arquivo * @throws FileNotFoundException * @throws IOException */ public byte[] converteFileToByteArray() throws FileNotFoundException, IOException{ File f = new File(caminho); FileInputStream fs = new FileInputStream(f); byte[] byt = new byte[(int)f.length()]; for(int i = 0;i < f.length();i++){ byt[i] = (byte) fs.read(); } fs.close(); System.out.println("Conversão ok"); return byt; }

Bom, vou dormir, agradeço a ajuda de todos!
Boa noite

Faz o seguinte coloca um timeout dentro do laço while do servidor, quando ele estourar vai gerar uma exceção de socket.
vai mudando a linha do timeout dentro do seu código até descobrir qual linha esta fazendo ele estourar.
debugar é preciso…


        while(true){  
                         dataRec.setSoTimeout (1000);// exceção programada de socket  estoura em 1000ms

                DatagramPacket dp = new DatagramPacket(dadosRecebidos, dadosRecebidos.length);  
               .....
               ......
}

sds

j.silvestre

o laço ta parando na linha:

dataRec.receive(dp);

mas eu executo a classe do cliente que envia os dados, mas não sei o q ta acontecendo.

guisantogui eu acho que o problema esta na sua classe cliente que não esta enviando para a porta certa.
faz o seguinte faz o download do wireshark, e verifica para onde os pacotes estão sendo enviados.
http://www.wireshark.org/download.html
na net vc acha tutorial de como usar o wireshark.

sds

j.silvestre

vc esta rodando o cliente e o servidor na mesma maquina ?

para fins de debug coloca o endereço ip do servidor no cliente na unha: 192.168…

sds

j.silvestre

cara, não sei se é esse o problema, por que mandei o servidor imprimir o metodo “isConected()” e ele retornou false, isso não deveria ser true?

Verifica se o servidor abriu a porta. na verdade o que esta acontecendo é que o servidor esta preso dentro do while esperando dados
que nunca chega.ele só vai dar conectado quando algum cliente se conectar a porta que ele abriu.
usa o wireshark e ve para que endereço e porta o cliente esta enviando os dados.

sds

j.silvestre

Galera acho que ta resolvido vou fazer alguns testes e ja retorno o resultado