Ftp client

Bom dia pessoal!
Estou tentando fazer um programinha client de FTP e estou tendo alguns problemas, mas não com o java especificamente. Mais na partde do próprio protocolo FTP.
Consegui fazer a conexão com o servidor e enviar alguns comandos como USER, PASS, CWD, PWD…
Ao que diz respeito à visualização e transferência de arquivos (LIST, RETR) estou tendo dificuldades, pois o server me manda uma mensagem tipo “Openinmg data connection to /bin/ls” e eu não sei o que fazer. Após um tempo ele me manda uma msg de time out.
O que me disseram é que eu tenho que usar o comando PORT para dizer ao server em que porta eu quero receber a listagem dos dados (por exemplo).
Então fiz uma ServerSocket que escutava a porta 2222, e usei o comando PORT informando meu ip e essa porta.
mas mesmo assim não recebo nada.
Alguem conhece bem o protocolo FTP ou sabe onde eu posso encontrar essas informações?

Desculpe o post meio extenso e obrigado!!!

Willian

Da uma lida no RFC que define o protocolo FTP:

http://www.rfc-editor.org

Se nao tiver o que vc quer saber sobre o protocolo la, entao nao existe :wink:

De uma olhada no formato do comando PORT:

PORT ip,ip,ip,ip,port,port

Lembre-se de dividir a porta em dois, se vc trabalhar com um int faça o seguinte:

System.out.println("PORT " + ipPart[0] + "," + ipPart[1] + "," + ipPart[2] + "," + ipPart[3] + "," + String.valueOf(port >> 8) + "," + String.valueOf(port & 0x00FF) + END_OF_LINE);

E lembre-se que o fim da linha deve ser um

Fallow

então… mas o retorno do meu comando PORT está ok… eu num to sabendo o ke fazer depois disso…
e a documentação RFC eu ate li, mas teve algumas coisas ke eu nao entendi… justamente por isso eu vim pedir um help pra vcs.
[]s

Tenta usar o modo passivo… pra ver se funciona…
Manda PASV + END_OF_LINE que ele te retornará um ip e uma porta onde vc deve se conectar… daí vc usa um socket normal…

Só te lembra que os comando vc envia por um socket, o outro só é usado para envio de dados…

Fallow

certo!!! era essa minha duvida! na verdade, vc acabou “adivinhando” minha duvida principal hehehe… pq eu num perguntei explicitamente isso…
então farei o seguinte:
envio o comando PASV, pego o ip e porta ke o server me mandar e abro uma nova socket através de um threadzinha só pra “escutar” pelo envio de dados, mas continuarei enviando comandos pela minha socket “principal”…

valeu mesmo!!!
[]s

cara, desculpe minha ignorancia… ma so ke eh isso aki oh:

System.out.println("PORT " + ipPart[0] + "," + ipPart[1] + "," + ipPart[2] + "," + ipPart[3] + "," + String.valueOf(port >> 8) + "," + String.valueOf(port & 0x00FF) + END_OF_LINE); 

o ke seria o port >> 8 e o port & 0x00FF

eu testei isso e vi ke retornou certo… ma eu nunca tinha visto em java antes!!! tem como da uma explicada ai!?

[]s

Bom, no primeiro caso que é port >> 8, ele está rolando oito bits para a direita. Dessa forma se a porta com 16 bits fosse o seguinte:

1010 0100 1011 0111

Com essa instrução passaria a ser:

0000 0000 1010 0100

No outro código port & 0x00FF ele está fazendo um and de bits ocorrendo o seguinte:

1010 0100 1011 0111

Com essa instrução passaria a ser:

0000 0000 1011 0111

Isso deve ser feito pois o comando espera pela porta dividida em dois conjuntos de 8 bits…

Conseguiu fazer funcionar???

Fallow

grande, consegui!
muito obrigado MESMO!!!
era isso mesmo… tem ke dar um comando PASV pro server me dizer ke porta ele ker ke eu receba dados… e ja era…
agora eu tenho ke fazer o trabalho direito… pq eu fiz tudo numa classe soh hauahUAhUAh pra testar… agora vou PROGRAMAR EM JAVA MESMO.

isso foi mais um teste pra entender o tal protocolo FTP.
agora blz…
valeu a todos ke ajudaram ai!!!
[´]s!

Estou com o mesmo problema aqui, mas a pergunta é a seguinte: eu mando o PASV e tenho o ip e a porta (ip,ip,ip,ip,port,port).
Em seguida eu uso o comando PORT, configuro o socket com essa porta e mando os comandos pela 21 e recebo os dados por ela. Essa é a sequencia?

Melhor dizendo, quando eu tenho sucesso usando PORT eu preciso usar PASV tbm?