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…