Estou construindo uma Aplicação EJB na qual tenho que apartir do meu session enviar um arquivo via ftp. Para tanto criei o seguinte método:
public boolean sendFileByFtp(String fullPath) throws IOException {
// Formatando o nome do arquivo substituindo "//" por "\"
fullPath = fullPath.replace("//", File.separator);
System.out.println(">>> fullPath " + fullPath);
String nomeArquivo = null;
boolean result;
FTPClient ftp = new FTPClient();
ftp.connect( "192.168.0.101" );
// Verifica se não está conectado
//verifica se conectou com sucesso!
if( FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) {
ftp.login( "okscm", "123456" );
} else {
//erro ao se conectar
ftp.disconnect();
System.out.println("Conexão recusada");
}
//abre um stream com o arquivo a ser enviado
InputStream is = new FileInputStream( fullPath );
//pega apenas o nome do arquivo
int idx = fullPath.lastIndexOf(File.separator);
if( idx < 0 ) idx = 0;
else idx++;
nomeArquivo = fullPath.substring( idx, fullPath.length() );
//ajusta o tipo do arquivo a ser enviado
if( fullPath.endsWith(".txt") ) {
ftp.setFileType( FTPClient.ASCII_FILE_TYPE );
} else if( fullPath.endsWith(".jpg") ) {
ftp.setFileType( FTPClient.BINARY_FILE_TYPE );
} else {
ftp.setFileType( FTPClient.ASCII_FILE_TYPE );
}
System.out.println("Enviando arquivo "+nomeArquivo+"...");
System.out.println(">>>InputStream: " + is);
System.out.println(">>>nomeArquivo: " + nomeArquivo);
System.out.println(">>>FTP: "+ ftp.getStatus());
//faz o envio do arquivo
ftp.storeFile( nomeArquivo, is );
System.out.println("Arquivo "+nomeArquivo+" enviado com sucesso!");
is.close();
ftp.disconnect();
System.out.println("Fim. Tchau!");
return true;
}
Para este mátodo é passado como parãmetro o caminho e nome do arquivo.
O problema é que quando tento executar este método é lançado a seguinte exceção:
[#|2006-07-14T18:13:10.220-0300|WARNING|sun-appserver-pe8.2|javax.enterprise.system.stream.err|_ThreadID=16;|
java.net.BindException: Cannot assign requested address: bind
at sun.nio.ch.Net.bind(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:119)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
at com.sun.enterprise.server.ss.ASServerSocket.bind(ASServerSocket.java:244)
at com.sun.enterprise.server.ss.ASServerSocketImpl.listen(ASServerSocketImpl.java:121)
at java.net.ServerSocket.bind(ServerSocket.java:320)
at java.net.ServerSocket.<init>(ServerSocket.java:185)
at org.apache.commons.net.DefaultSocketFactory.createServerSocket(DefaultSocketFactory.java:155)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:475)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:388)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1388)
at br.com.okscm.servertok.session.TokSessionFacadeBean.sendFileByFtp(TokSessionFacadeBean.java:276)
at br.com.okscm.servertok.session.TokSessionFacadeBean.solicitaServicoTok(TokSessionFacadeBean.java:187)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
...
O estranho é que quando executo a seguinte classe fora do servidor de aplicação, no caso estou usando o Application Server da Sun, rola tudo normal:
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPClient;
public class MyFTP {
public static void main( String[] args ) {
String nomeArquivo = null;
FTPClient ftp = new FTPClient();
try {
ftp.connect( "192.168.0.101" );
//verifica se conectou com sucesso!
if( FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) {
ftp.login( "okscm", "123456" );
} else {
//erro ao se conectar
ftp.disconnect();
System.out.println("Conexão recusada");
System.exit(1);
}
//para cada arquivo informado...
for( int i=0; i<args.length; i++ ) {
//abre um stream com o arquivo a ser enviado
InputStream is = new FileInputStream( args[i] );
//pega apenas o nome do arquivo
int idx = args[i].lastIndexOf(File.separator);
if( idx < 0 ) idx = 0;
else idx++;
nomeArquivo = args[i].substring( idx, args[i].length() );
//ajusta o tipo do arquivo a ser enviado
if( args[i].endsWith(".txt") ) {
ftp.setFileType( FTPClient.ASCII_FILE_TYPE );
} else if( args[i].endsWith(".jpg") ) {
ftp.setFileType( FTPClient.BINARY_FILE_TYPE );
} else {
ftp.setFileType( FTPClient.ASCII_FILE_TYPE );
}
System.out.println("Enviando arquivo "+nomeArquivo+"...");
//faz o envio do arquivo
ftp.storeFile( nomeArquivo, is );
System.out.println("Arquivo "+nomeArquivo+" enviado com sucesso!");
}
ftp.disconnect();
System.out.println("Fim. Tchau!");
} catch( Exception e ) {
System.out.println("Ocorreu um erro: "+e);
System.exit(1);
}
}
}
Algúem sabe dizer se existe alguma restrição pelo fato do primeiro artefacto de código estar rodando num servidor de aplicação, pois, basicamente é a unica diferença que percebo.
Fico agradecido por qualquer ajuda que possa surgir!