FTP cliente J2ME

Ola a todos, venho aqui para tentar esclarecer uma duvida.

Gostaria de criar um cliente j2me para transferencia de arquivos via FTP.

Pesquisei encontrei alguma coisa usando commons net do apache. Mas a principio nada de J2ME.

Em ultimo caso eu posso tentar fazer upload de alguma outra maneira do meu cliente j2ME ?

Obrigado

Abraços

Isso varia muito do que vc quer transferir.
As maneiras mais padrões e com o api bem rico é por sms e mms.
Existe também uma api do bluetooth,mas eu a acho bem complicada.
Em fim se for dados o sms e se for fotos mms.
Se for informações para serem enviadas para um servidor geral pode ser via web service.

Sera enviado um xml gerado no proprio mobile, neste caso.

Mas seria vantagem gerar ele localmente e depois enviar,
ou gerar ele via webservice e enviar atraves do servidor?

O processador do dispositivo móvel é pequeno e bem limitado.
Se você puder jogar isso via web service é melhor.
Uma dica para dispositivos móveis é:
Quanto menor o processamento vc utilizar melhor afinal vc não tem muito.

Boa dica :smiley:

entendi, vou fazer o cliente enviar os dados via webService,
e assim que o servidor receber ele gera o xml e envia direto.

Uma classe java no servidor pode fazer conexao por FTP e enviar direto, como um processo em sequencia?

Peço desculpas se as perguntas são meio de iniciantes,
mas estou entrando a pouco tempo neste universo java.

Sim seria melhor.
Até por que existem apis mais ricas no mundo dos servidores.

Nâo precisa se desculpar.
Você pode fazer quantas perguntas você quiser afinal o grupo foi criado para isso.

Vlw otavio,

então pelo que eu entendi, eu farei o formulario no mobile, ele envia as informações via webService e o meu servidor recebe.

Assim que ele receber executa a classe para gerar o xml e depois envia :smiley:

Acho que agora esta resolvido.

Obrigado mesmo, e assim que eu conseguir coloco a solução completa aqui,

ehehe, pode demorar um pouquinho mas eu vou atras e posto

Eu acredito que sim e de maneira bem mais fácil que pelo me.
O jme não recebeu muitas atualizações.
Mas se teve algumas promessas no javaone Brasil.

[quote=d1eg0.]Ola a todos, venho aqui para tentar esclarecer uma duvida.

Gostaria de criar um cliente j2me para transferencia de arquivos via FTP.

Pesquisei encontrei alguma coisa usando commons net do apache. Mas a principio nada de J2ME.
[/quote]
Em J2ME você conversa diretamente com o servidor FTP usando a classe SocketConnection.
Você deve ler a RFC do protocolo FTP e implementá-la em J2ME. Nada difícel.

Se não se sente confortável ou não tem capacidade, pode partir para uma abordagem mais tradicional que é com HttpConnection, transmitir para um servidor Web e este ter um script PHP ou uma servlet Java para receber o conteúdo e dar o devido tratamento.

Então posso fazer a conexao direta do meu cliente j2me ao FTP
usando socketConnection, pode me dar uma dica boone?

ou um exemplo, para mim pegar uma direção

Poxa, te dei a mão e vc quer o braço !

Te dei a dica para ler a RFC do protocolo FTP, que lhe daria uma baita bagagem inclusive para entender outros protocolos no futuro, te disse qual classe usar, e vc ainda quer código pronto ?

Desculpa, mas tradicionalmente eu não dou o peixe, eu ensino a pescar.

A direção para vc alcançar o q quer, foi dada.

Se tivesse digitado as palavras chave no Google, já estaria com exemplos na mão.

Ok , só perguntei se nao tinha um exemplo um link ou algo assim,
não pedi o codigo até pq a minha intenção era apenas tirar a duvida.

Mas como surgiu a dica do otavio eu ja estava levando pra esta solução, até que você comentou que havia como fazer a conexão.

vou pesquisar um pouco mais

obrigado

Tenho novidades, mas tambem duvidas,

estudei o protocolo que foi sitado, cheguei a conclusao do envio de informações como usuario e senha pelo proprio host…

ex:

[code] try {
SocketConnection client = (SocketConnection) Connector.open(“socket://usuario:senha@ftp.empresa.com.br:21”);

    } catch (IOException ex) {

        System.exit(0);
    }

[/code]

posso estar errado, mas acredito que esteja mais perto da solução do que antes. O problema é que o envio de usuario e senha possui um ’ : '[b], fazendo com que ele interprete como a porta

o usuario como host e a senha como porta.

Gerando o erro.

Se alguem tiver uma dica,

PS: estudei o rfc

Não especifique o usuário e senha na URL, pois vc irá passar os dois quando a conexão for completada e vc se identificar com os comandos USER e PASS.

Bom acredito que estou no caminho certo,

envio os comandos user e pass pelo client do socket mesmo?

PS: ftp por comandos unix eu conheço.

Me parece que ainda não caiu sua ficha de que é de sua responsabilidade “conversar” diretamente com o servidor FTP através dos comandos específicos que te indiquei para estudar quando citei a RFC do protocolo.

Você é a parte ativa nesta conversação e o servidor reativo.
Você envia comandos, ele envia respostas a estes.

O socket é o canal de comunicação. o FTP é a “lingua” que é “conversada” neste canal.

Toda a internet é baseada em socket, só mudando o protocolo (HTTP, FTP, SMTP, POP3,etc…)

tenho o seguinte codigo até o momento, estou longe de acertar a comunicação (acredito eu),

o envio dos comandos user & pass, estou fazendo por outputstream;

[code] try {
SocketConnection client = (SocketConnection) Connector.open(“socket://ftp.empresa.br:21”);

        OutputStream out = client.openOutputStream();
        InputStream input = client.openInputStream();


        String str = "user";
        String str2 = "usuario";
        String str3 = "pass";
        String str4 = "senha";

        byte line[] = new byte[100];

        line = str.getBytes();
        out.write(line);

        System.out.println("Envia o comando de usuario");

        line = str2.getBytes();
        out.write(line);

        System.out.println("envia a senha de usuario");

        line = str3.getBytes();
        out.write(line);

        System.out.println("envia o comando para senha");

        line = str4.getBytes();
        out.write(line);

        System.out.println("envia a senha");

        

} catch (IOException ex) {

        System.exit(0);
    }

[/code]

Faz o seguinte:

Entenda 1o como é a comunicação com o servidor…o teu código tá faltando esperar a resposta do servidor ao envio de um comando para daí poder enviar outro etc.

Além disto não tem uma variável que funciona como máquina de estados, o que garantirá que de acordo com a resposta, vc emita um ou outro comando dependendo do estado da conversação atual.

No teu código vc assume que o servidor tá instantaneamente te atendendo e nenhuma recusa foi feita.

Brinque um pouco com o servidor de FTP através do Telnet e daí quando vc pegar a manhã de como essa comunicação dá, quais são os erros,etc, vc saberá como deve implementar teu código.

Vc sabe como usar o Telnet, não ?

Melhorou agora estou tendo um retorno diferente no meu codigo,

220 ProFTPD 1.3.1 Server (TEC) [200.180.000.000]

como resposta, o meu codigo ainda esta assim, mas esta falando alguma coisa ainda.

import com.sun.midp.io.j2me.storage.File;
import java.io.*;
import java.io.IOException;
import javax.microedition.midlet.MIDlet;
import org.jibble.simpleftp.*;
import javax.microedition.io.*;


public class Conexao extends MIDlet{

   

    protected void startApp() {

try {
            SocketConnection client = (SocketConnection) Connector.open("socket://200.180.000.000:21");
           
            OutputStream out = client.openOutputStream();
            InputStream input = client.openInputStream();
            StringBuffer sb = new StringBuffer();

            
            out.write("user".getBytes());
            out.flush();
            
            out.write("ftpusuario".getBytes());
            out.flush();

            

         
         int c =  input.read();
       
     while(c !=-1){
         sb.append((char)c);
         c = input.read();
         System.out.println(sb.toString());
     }
           

    } catch (IOException ex) {

            System.exit(0);
        }


    }

    protected void pauseApp() {
    }

    protected void destroyApp(boolean unconditional) {
    }

}

estou indo pela primeira dica tbm de enviar os dados para o servidor e ele fazer todo o resto de gerar e enviar o arquivo.
mas nao consigo chamar o metodo de conexao pelo command


import java.io.IOException;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

import org.ksoap.SoapObject;
import org.ksoap.transport.HttpTransport;

public class ClienteJ2ME extends MIDlet implements CommandListener {
  private Display display;
  private Form frmPrincipal;
  private TextField valor1,valor2;
  private Command okCmd;
  private  TextBox textbox = null;

  // link do web service
  private String url = "http://127.0.0.1/teste/Web_service/Nusoap/Server.php";
  //private String url ="http://localhost:8080/axis/soma.jws";





  public void startApp() {


    display = Display.getDisplay(this);
    frmPrincipal = new Form("Calculadora");

     valor1 = new TextField("Valor 1","", 20,TextField.NUMERIC);
     valor2 = new TextField("Valor 2","", 20,TextField.NUMERIC);
     okCmd =  new Command("somar",Command.OK,1);



    frmPrincipal.addCommand(okCmd);
    frmPrincipal.append(valor1);
    frmPrincipal.append(valor2);

    frmPrincipal.setCommandListener(this);
    display.setCurrent(frmPrincipal);





  }

  public void pauseApp() {}

  public void destroyApp(boolean unconditional) {}

    public void commandAction(Command c, Displayable d) {

        if(c == okCmd){
 
      th.start();
    

        }

    }

final Thread th = new Thread() {

 public void testWebService() throws IOException{

    StringBuffer stringBuffer = new StringBuffer();
    TextBox textBox = null;


    // Chama o WebService
    SoapObject client = new  SoapObject(url,"geraXML");
    client.addProperty("a",new Integer(4));
    client.addProperty("b",new Integer(5));


    HttpTransport ht = new HttpTransport(url,"geraXML");
    stringBuffer.append("Resultado = "+ht.call(client));



    // mostra o valor do resultado na tela.
    textBox = new TextBox("Teste WebService", stringBuffer.toString(), 1024, 0);
    display.setCurrent(textBox);
  }

    };
  
}

Alguma dica para um dos casos?