Metodo bind() - DatagramSocket

7 respostas
guisantogui

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 -

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);
        }
        
    }
}

Server

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);
        }
        
    }
}

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

7 Respostas

j.silvestre

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

guisantogui

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.

j.silvestre

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

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

guisantogui

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?

j.silvestre

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

guisantogui

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

Criado 3 de junho de 2011
Ultima resposta 3 de jun. de 2011
Respostas 7
Participantes 2