Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Error al enviar ficheros por FTP

Buenos días,
Estoy conectándome a un ftp desde mi aplicación java y veo que desde mi portatil funciona perfectamente y desde otro ordenador también pero hay un ordenador en el que lo intento hacer funcionar y el mismo código falla sacando el siguiente mensaje de error:
"software caused connection abort socket write error"
Había pensado que podría ser el jdk pero tengo la misma jdk en los dos 3 equipos, de hecho he instalado todo con el mismo instalador así que me quedo sin ideas.

El código es el siguiente aunque realmente da igual ya que el mismo funciona en otros ordenadores.:

package interno.datos;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

public class ftp {
private FTPClient client;
private ConfigProperties prop;

/**
* Constructor.
* @param prop
*/
public ftp(ConfigProperties prop){ this.prop=prop; }

/**
* Sube el fichero especificado al ftp.
* @param fileName Nombre del fichero a enviar.
* @param path
* @param b Este valor debe ser false al principio para que se ejecute dos veces.
*/
public void enviar(String fileName, String path,boolean b){
try {
conectar();
if(b) changePath(prop.getFTP_path()+path);
else changePath(prop.getFTP_path()+"new");

//Subiendo el fichero al FTP en la carpeta asignada.
FileInputStream fis = new FileInputStream(prop.getXML_path()+fileName);
client.storeFile(fileName, fis);

//Desconexión del FTP.
fis.close();
desconectar();

if(b) enviar(fileName, path, false);
else{
Object[] options = {"Aceptar"};
JOptionPane.showOptionDialog(null,"Envio correcto","Estado de envío",
JOptionPane.OK_OPTION, JOptionPane.INFORMATION_MESSAGE,
null, options, options[0]);

File fichero=new File(prop.getXML_path()+fileName);
fichero.delete();
fichero.deleteOnExit();
}//Una vez subido al FTP borramos el fichero del pc.
} catch (IOException ex) {
Object[] options = {"Aceptar"};
JOptionPane.showOptionDialog(null,"Envio fallido: \n"+ex,"Estado de envío",
JOptionPane.OK_OPTION, JOptionPane.ERROR_MESSAGE,
null, options, options[0]);
}
}

public boolean descargar(){
boolean enviado=false;
try {
conectar();
changePath(prop.getFTP_path()+"new");
for (Object fileName : listar()) {
FileOutputStream fis = new FileOutputStream(prop.getXML_pathDownload()+fileName);
client.retrieveFile(fileName.toString(),fis);
enviado=true;
fis.close();
borrar(fileName.toString());
}
desconectar();
} catch (IOException ex) { System.out.println(ex);}
return enviado;
}

//for (Object ftpFile : listar()) { System.out.println(ftpFile); }
private ArrayList listar(){
ArrayList lista= new ArrayList();
try { for (FTPFile ftpFile : client.listFiles()) { lista.add(ftpFile.getName()); }
} catch (IOException ex) { }
return lista;
}
private void conectar(){
try {
client = new FTPClient();

//Conexión al FTP.
client.connect(prop.getFTP_url());
client.login(prop.getFTP_user(),prop.getFTP_password());
client.setFileType(FTPClient.BINARY_FILE_TYPE);
} catch (IOException ex) { }
}
private void changePath(String path){try { client.changeWorkingDirectory(path); } catch (IOException ex) { } }
private void borrar(String fileName){ try { client.deleteFile(fileName); } catch (IOException ex) { } }
private void desconectar(){ try { client.logout(); client.disconnect(); } catch (IOException ex) { } }

enero 4, 2014 | Registered CommenterElena

Y desde ese tercer equipo te puedes conectar sin problemas utilizando algun cliente FTP como Filezilla? está en la misma red que los otros? tiene algún proxy de por medio?

Un saludo

enero 4, 2014 | Unregistered CommenterUnoPorAhi

He probado y veo que me pasa con otro equipo más por lo que ya me estoy volviendo loco, con dos me funciona y con otros dos no.
Uno de los ordenadores en los que no me funciona está en mi casa y otro en mi oficina pero mi portátil lo utilizo en los dos sitios y en éste sí me funciona el programa.
En todos los equipos tengo instalado el mismo antivirus con la misma configuración tanto de éste como de firewall y en los 4 me puedo conectar sin problemas al FTP por otros medios que no son la aplicación.

enero 4, 2014 | Registered CommenterElena

Vaya, se me ocurren muchas cosas que se pueden hacer
-Puedes hacer una prueba en esos dos equipos problemáticos desactivando por completo firewalls+antivirus?

-Puedes probar a lanzar el programa con este argumento?:
-Djava.net.preferIPv4Stack=true

-Aqui tienes un código para conectarte usando las misma librerías Apache que funciona sin ninguna duda. http://www.java2s.com/Code/Java/Network-Protocol/UsetheFTPClient.htm
Puedes probarlo en esos equipos? Si te funciona entonces el problema está en tu código, revisa lo que te falta.

Un saludo

enero 4, 2014 | Unregistered CommenterUnoPorAhi

Muchísimas gracias por tu ayuda UnoPorAhi, llevaba unos cuantos días volviéndome loco porque no encontraba solución, hasta había pensado en formatear uno de los dos equipos en los que no funcionaba para ver si era alguna instalación que tuviesen en común pero acabo de probar a meter dentro de la aplicación el siguiente código que es el equivalente al argumento de lanzamiento de programa que me comentaste:
System.setProperty("java.net.preferIPv4Stack" , "true");

Ahora con ese código metido funciona la conexión al FTP a la perfección.

enero 5, 2014 | Unregistered Commentermchg

Genial, enhorabuena!
Parece que es por algún tema del firewall win7/vista:
http://stackoverflow.com/questions/6990663/java-7-prevents-ftp-transfers-on-windows-vista-and-7-if-firewall-is-on-any-idea

Si alguien pregunta por un problema similar ahora ya sabemos lo que puede ser.

Un saludo

enero 5, 2014 | Unregistered CommenterUnoPorAhi