DatagramSocket - envio de arquivos txt

4 respostas
C

Olá pessoal,

Preciso enviar um arquivo txt através de DatagramSocket. Qual seria a melhor forma de fazer isso? Preciso ler o arquivo e atribuir esse texto pra uma String, para assim enviar o arquivo? Ou há a possibilidade de enviar o arquivo diretamente sem a necessidade de passá-la para uma String?

Obrigado desde já!

4 Respostas

E

Leia o arquivo em grupos de no máximo 1400 bytes. Transfira esses bytes pelo socket UDP.

O problema, é claro, é que você pode ter pacotes que acabem “faltando”, pela própria natureza do protocolo UDP, que não é confiável. Você precisa criar seu protocolo, se sua exigência é que não faltem pedaços.

ViniGodoy

Ou implementar um pequeno servidor TFTP:
http://www.faqs.org/rfcs/rfc1350.html

Eu já implementei um servidor, é bem simples. APIs para clientes vc acha por aí, como a do projeto jakarta.
O protocolo já cobre esses detalhes que o entaglement falou: ordenação e sequencia dos pacotes.

C

Obrigado pelas respostas!

Teria como tu me ensinar a ler tal arquivo com um determinado tamanho de bytes? Como quando tu disse “Leia o arquivo em grupos de no máximo 1400 bytes”?

Obrigado mais uma vez!

E

Dica: tente implementar o tal servidor TFTP, ou procure uma implementação em Java na Internet.

De qualquer maneira, se quiser ficar quebrando a cabeça, só vou explicar como ler um arquivo de 1400 em 1400 bytes, e copiá-lo para outro arquivo. Leia a documentação, que é melhor para sua saúde mental que ficar quebrando a cabeça, tentando sem parar sem entender o que está fazendo.

Consulte a documentação em: http://java.sun.com/javase/6/docs/api/index.html

import java.io.*;

class TesteLeitura {
    public static void main (String[] args) {
        BufferedOutputStream bos = null;
        BufferedInputStream bis = null;
        try {
            bis = new BufferedInputStream (new FileInputStream ("teste.txt"));
            bos = new BufferedOutputStream (new FileOutputStream ("saida.txt"));
            byte[] buffer = new byte[1400];
            for (int nBytesLidos = bis.read (buffer); nBytesLidos > 0; nBytesLidos = bis.read (buffer)) {
                // Atenção, amigo: É EXTREMAMENTE IMPORTANTE pegar o número de bytes lidos.
                // Se não fizer isso, você pode ter vários problemas (como mandar mais bytes que 
                // o realmente necessário. 
                // NESTE CASO, ESTAMOS ESCREVENDO EM UM ARQUIVO, MAS VOCÊ PODE, POR EXEMPLO,
                // ENVIAR UMA MENSAGEM.
                bos.write (buffer, 0, nBytesLidos); 
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            // É INDISPENSÁVEL FECHAR OS ARQUIVOS. SE SEU PROFESSOR DISSE QUE NÃO É PRECISO,
            // POR CAUSA DO GARBAGE COLLECTOR, ENTÂO ELE NUNCA ESCREVEU UMA APLICAÇÂO DE VERDADE.
            if (bos != null) try { bos.close(); } catch (IOException ex2) { }
            if (bis != null) try { bis.close(); } catch (IOException ex2) { }
        }
    }
}
Criado 16 de novembro de 2009
Ultima resposta 16 de nov. de 2009
Respostas 4
Participantes 3