Ftp em J2EE

0 respostas
L

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!

Criado 14 de julho de 2006
Respostas 0
Participantes 1