Problema ao enviar arquvo via socket

1 resposta
D

Cliente:

String fileName = fileName(fNome, ultimaData);
            String directoryName = fileName(dNome, ultimaData);

            File file = new File(directoryName + fileName);
            FileInputStream in = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(file));

            OutputStream out = socket.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(out));
            writer.write(file.getName() + "\n");
            writer.flush();

            int bytesTransferidos = 0;
            int tamanho = 1400; // buffer de 1400 Bytes
            byte[] buffer = new byte[tamanho];

            for (int nBytesLidos = bis.read(buffer); nBytesLidos > 0; nBytesLidos = bis.read(buffer)) {

                bytesTransferidos += nBytesLidos;
                out.write(buffer, 0, nBytesLidos);
                out.flush();

            }

            System.out.println(fileName);
            System.out.println(bytesTransferidos
                    + " bytes transferidos.\n");
Servidor:
public void run() {

        FileOutputStream out;
        InputStream in;
        try {
            in = socket.getInputStream();
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(in));

            String fName = reader.readLine();

            File arquivo = new File("C:/java/novo/" + fName);
            out = new FileOutputStream(arquivo);

            int bytesRecebidos = 0;
            int tamanho = 1400; // buffer de 1400 Bytes
            byte[] buffer = new byte[tamanho];

            long mileSeconds = new Date().getTime();

            for (int nBytesLidos = in.read(buffer); nBytesLidos > 0; nBytesLidos = in.read(buffer)) {
                bytesRecebidos += nBytesLidos;
                out.write(buffer, 0, nBytesLidos);
                                System.out.println(bytesRecebidos);
                out.flush();
            }

            writer.write("ok");
            writer.flush(); // deletar

            long mileSecondsEnd = new Date().getTime();

            System.out.println(bytesRecebidos + " bytes recebidos em " + (mileSecondsEnd - mileSeconds) + "ms : " + socket.getInetAddress() + "\n");

            reader.close();
            out.close();

        } catch (IOException e) {
            System.out.print(e);
            System.out.println("Algum problema ocorreu para criar ou receber o socket.");

        } finally {

            try {
                System.out.println("Conexao encerrada : " + socket.getInetAddress() + "\n");
                socket.close();

            } catch (IOException e) {
            }
        }

    }

O problema é o seguinte, hora o arquivo é enviado inteiro hora o arquivo é enviado faltando 8kb.

Estou tentando fazer um while que abre vários clientes cada um enviando um arquivo diferente, nesse caso o servidor abre uma Thread para cada conexão nova e fica ouvindo enquanto existirem bytes, entretanto as vezes os arquivos corretamente outras vezes faltando os benditos 8kb, estou testando ambos Cliente e servidor na mesma máquina, algum problema ?

Alguém tem uma solução ou pode apontar meu erro ?

Abs, grato desde já.

1 Resposta

D

Encontrei o problema o BufferedReader está pegando um teco dos dados bytes do arquivo.

Aproveitando o tópico, alguém sabe me responder como que o BufferedReader está bagunçando com meu input ?

Usei o DataInput fazendo readUTF() funcionou muito bem.

Criado 20 de outubro de 2010
Ultima resposta 20 de out. de 2010
Respostas 1
Participantes 1