Transferência de arquivos com sockets... Exception

0 respostas
F

Bom dia pessoal, me ocorre o seguinte… Eu desenvolvi um aplicativo que transfere arquivo através de socktes, quando executado no Mac OS X tudo ocorre normal, mas quando executado no linux dá uma exceção:

Exception in thread main java.net.SocketException: Connection reset

at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:114)

at java.net.SocketOutputStream.write(SocketOutputStream.java:154)

at java.io.DataOutputStream.write(DataOutputStream.java:108)

at servidor.Main.main(Main.java:61)

Abaixo está meu código, gostaria de perguntar se alguém sabe o porquê está dando isso, e por favor, se alguém puder me ajudar a resolver, eu ficaria muito grato…

Servidor:

/*
 * Fábio Lanza Brandão Filho
 * Federal University of ABC
 * Computer Science Bachelor
 * 
 * [email removido]
 */

package servidor;

import java.io.*;
import java.net.*;

/**
 *
 * @author Fabio
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception{
        // TODO code application logic here
        int porta = Integer.parseInt(args[0]);
        String arquivo = args[1];

        System.out.println("Lendo arquivo...");
        File f = new File(arquivo); //Arquivo a ler; inicializando em outra parte
        int filesize = (int) f.length(); //Calcula o tamanho do arquivo
        byte[] data = new byte[filesize]; //Cria um array suficientemente grande
        //Cria um fluxo para ler o arquivo
        DataInputStream in = new DataInputStream(new FileInputStream(f));
        in.readFully(data); //Lê o conteúdo do arquivo para o array
        in.close();

        /*Tecnologia para enviar blocos de bytes*/

        int numBlocos = filesize/1024; int bloco = 1024; int i = 0;
        int blocosResto = filesize%1024; int inicio = 0;

        if(numBlocos == 0){
            bloco = blocosResto;
        }

        /*Tecnologia para enviar blocos de bytes*/

        boolean enviando = true;
        ServerSocket ss = new ServerSocket(porta);
        Socket s;

        System.out.println("Entrando em loop para enviar arquivo...");
        while(enviando == true){
            s = ss.accept();
            System.out.println(s.getInetAddress() + " se conectou...");

            DataOutputStream dos = new DataOutputStream(s.getOutputStream());

            System.out.println("Enviando o tamanho do arquivo...");
            dos.writeInt(filesize); dos.flush();

            System.out.println("Enviando arquivo...");
            while(i <= numBlocos){
                dos.write(data, inicio, bloco); dos.flush();
                System.out.println("Enviado array de bytes: indices " + inicio + " a " + ((inicio + bloco) -1 ) + "...");
                i++;

                if(i < numBlocos){
                    inicio += bloco;
                }
                if(i == numBlocos){
                    inicio += bloco;
                    bloco = blocosResto;
                }

            }
            enviando = false; //desabilitar se for um servidor contínuo...
        }
    }

}

Cliente:

/*
 * Fábio Lanza Brandão Filho
 * Federal University of ABC
 * Computer Science Bachelor
 * 
 * [email removido]
 */

package cliente;

import java.io.*;
import java.net.*;

/**
 *
 * @author Fabio
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception{
        // TODO code application logic here
        String ip = args[0];
        int porta = Integer.parseInt(args[1]);
        String arquivo = args[2];

        Socket s = new Socket(ip, porta);

        DataInputStream dis = new DataInputStream(s.getInputStream());

        System.out.println("Lendo tamanho do arquivo esperado...");
        int filesize = dis.readInt();

        /*Tecnologia para enviar blocos de bytes*/

        int numBlocos = filesize/1024; int bloco = 1024; int i = 0;
        int blocosResto = filesize%1024; int inicio = 0;

        if(numBlocos == 0){
            bloco = blocosResto;
        }

        /*Tecnologia para enviar blocos de bytes*/

        byte[] data = new byte[filesize];

        System.out.println("Recebendo arquivo...");
        while(i <= numBlocos){
            dis.read(data, inicio, bloco);
            System.out.println("Recebendo array de bytes: indices " + inicio + " a " + ((inicio + bloco) - 1) + "...");
            i++;


            if(i < numBlocos){
                inicio += bloco;
            }
            if(i == numBlocos){
                inicio += bloco;
                bloco = blocosResto;
            }
        }

        FileOutputStream fos = new FileOutputStream(arquivo);
        DataOutputStream dos = new DataOutputStream(fos);


        System.out.println("Montando arquivo...");
        dos.write(data);

    }

}

Muito obrigado pessoal…

Criado 16 de julho de 2009
Respostas 0
Participantes 1