Ola amigos. Estou implementando uma aplicação J2EE que tem que transferir um arquivo para outra máquina na rede. Para tanto optei pelo uso de um cliente FTP através da API commons-net utilizando o otimo tutorial publicado neste forum.
Baseado no metodo na classe de exemplo do tutorial:
01 import java.io.File;
02 import java.io.InputStream;
03 import java.io.FileInputStream;
04
05 import org.apache.commons.net.ftp.FTPReply;
06 import org.apache.commons.net.ftp.FTPClient;
07
08 public class MyFTP {
09 public static void main( String[] args ) {
10 String nomeArquivo = null;
11 FTPClient ftp = new FTPClient();
12 try {
13 ftp.connect( "ftp.provedor.com.br" );
14
15 //verifica se conectou com sucesso!
16 if( FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) {
17 ftp.login( "usuario", "senha" );
18 } else {
19 //erro ao se conectar
20 ftp.disconnect();
21 System.out.println("Conexão recusada");
22 System.exit(1);
23 }
24
25 //para cada arquivo informado...
26 for( int i=0; i<args.length; i++ ) {
27 //abre um stream com o arquivo a ser enviado
28 InputStream is = new FileInputStream( args[i] );
29 //pega apenas o nome do arquivo
30 int idx = args[i].lastIndexOf(File.separator);
31 if( idx < 0 ) idx = 0;
32 else idx++;
33 nomeArquivo = args[i].substring( idx, args[i].length() );
34
35 //ajusta o tipo do arquivo a ser enviado
36 if( args[i].endsWith(".txt") ) {
37 ftp.setFileType( FTPClient.ASCII_FILE_TYPE );
38 } else if( args[i].endsWith(".jpg") ) {
39 ftp.setFileType( FTPClient.BINARY_FILE_TYPE );
40 } else {
41 ftp.setFileType( FTPClient.ASCII_FILE_TYPE );
42 }
43 System.out.println("Enviando arquivo "+nomeArquivo+"...");
44
45 //faz o envio do arquivo
46 ftp.storeFile( nomeArquivo, is );
47 System.out.println("Arquivo "+nomeArquivo+" enviado com sucesso!");
48 }
49
50 ftp.disconnect();
51 System.out.println("Fim. Tchau!");
52 } catch( Exception e ) {
53 System.out.println("Ocorreu um erro: "+e);
54 System.exit(1);
55 }
56 }
57 }
Eu criei um método que recebe como parâmetro o endereço completo o caminho completo para o arquivo:
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;
}
Porém quando executo este método é lançado o seguinte erro:
[#|2006-07-14T06:45:43.793-0300|WARNING|sun-appserver-pe8.2|javax.enterprise.system.stream.err|_ThreadID=18;|
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)
Este método está num Session Stateless num Sun Application Server.
Se algúem puder me ajudar no que poderia estar errado, ficaria grato.
Abraços a todos.