Foros del Web » Programación para mayores de 30 ;) » Java »

ftp via sockets

Estas en el tema de ftp via sockets en el foro de Java en Foros del Web. Hola a todos. Tengo un problema con una aplicacion que estoy haciendo, la cuestion es la siguiente, tengo un servidor ftp, al cual me quiero ...
  #1 (permalink)  
Antiguo 02/01/2011, 12:40
Avatar de lair  
Fecha de Ingreso: enero-2009
Ubicación: header('Location: Morelia");
Mensajes: 1.052
Antigüedad: 15 años, 3 meses
Puntos: 46
ftp via sockets

Hola a todos.

Tengo un problema con una aplicacion que estoy haciendo, la cuestion es la siguiente, tengo un servidor ftp, al cual me quiero conectar desde java, esto ya lo logro, tambien puedo loguearme pero el problema viene cuando intento hacer movimiento, es decir, no puedo usar todos los comandos; cuando doy help no me aparese lo mismo en la aplicacion que desde consola.

consola:
ftp> help
Código Apache:
Ver original
  1. Commands may be abbreviated.  Commands are:
  2.  
  3. !       debug       mdir        sendport    site
  4. $       dir     mget        put     size
  5. account     disconnect  mkdir       pwd     status
  6. append      exit        mls     quit        struct
  7. ascii       form        mode        quote       system
  8. bell        get     modtime     recv        sunique
  9. binary      glob        mput        reget       tenex
  10. bye     hash        newer       rstatus     tick
  11. case        help        nmap        rhelp       trace
  12. cd      idle        nlist       rename      type
  13. cdup        image       ntrans      reset       user
  14. chmod       lcd     open        restart     umask
  15. close       ls      prompt      rmdir       verbose
  16. cr      macdef      passive     runique     ?
  17. delete      mdelete     proxy       send

java:
Código Apache:
Ver original
  1. 214-The following commands are recognized (* =>'s unimplemented):
  2. CWD     XCWD    CDUP    XCUP    SMNT*   QUIT    PORT    PASV    
  3. EPRT    EPSV    ALLO*   RNFR    RNTO    DELE    MDTM    RMD    
  4. XRMD    MKD     XMKD    PWD     XPWD    SIZE    SYST    HELP    
  5. NOOP    FEAT    OPTS    AUTH*   CCC*    CONF*   ENC*    MIC*    
  6. PBSZ*   PROT*   TYPE    STRU    MODE    RETR    STOR    STOU    
  7. APPE    REST    ABOR    USER    PASS    ACCT*   REIN*   LIST    
  8. NLST    STAT    SITE    MLSD    MLST    
  9. 214 Direct comments to root@localhost

aqui coloco algo de mi codigo:
Código java:
Ver original
  1. Connection con = null;
  2.  
  3.                 Main.Socket =  (SocketConnection) Connector.open("socket://"+host+":"+port);
  4.  
  5.                 response=Main.Socket.openInputStream();
  6.                
  7.                 //Main.sender es el objeto que uso para mandarle los comando al servidor
  8.                 Main.sender = new OutputStreamWriter(Main.Socket.openOutputStream());
  9.  
  10.                 int Resp=0;
  11.                 char CHAR;
  12.  
  13.                 while( ( Resp=response.read() ) != -1 ){
  14.                     CHAR=(char)Resp;
  15.                     System.out.print(CHAR);
  16.  
  17.                     Main.echo.setText(Main.echo.getText()+" "+CHAR);
  18.                 }

y asi es como mando los comandos:
Código java:
Ver original
  1. String user=Main.User.getString();
  2.  
  3.         Main.sender.write(user+"\n");
  4.         System.out.println("ftp> "+user);
  5.         Main.echo.setLabel("ftp> "+user);
  6.         Main.echo.setText("\n");
  7.         Main.User.setString("");

todas las excepciones estan debidamente capturadas.


NOTA: no puedo usar el paquete java.net ya que esto lo quiero para una aplicacion para un celular y la version ME no cuenta con esas clases.
Edito:
OTRA NOTA: tambien lo codifique en JSE pero obtengo la misma salida.

De antemano muchas gracias y feliz año que todos sus propositos los cumplan
  #2 (permalink)  
Antiguo 02/01/2011, 18:35
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: ftp via sockets

Hola,

La primera parte del help que mostraste es el help 'local' del programa ftp que estés usando, la segunda parte que mostraste el es help 'remoto' del servidor ftp al cual te conectaste; prueba con 'rhelp' desde la consola en el programa ftp que estés usando y probablemente vas a obtener el mismo resultado que Java.

El protocolo ftp tiene dos modalidades 'help local' y 'help remoto'.

Saludos,
  #3 (permalink)  
Antiguo 02/01/2011, 18:52
Avatar de lair  
Fecha de Ingreso: enero-2009
Ubicación: header('Location: Morelia");
Mensajes: 1.052
Antigüedad: 15 años, 3 meses
Puntos: 46
Respuesta: ftp via sockets

Efectivamente HackmanC, si desde consola ejecuto rhelp me da la misma salida. No lo habia pensado asi, que desde la consola uso un cliente ftp en modo texto (linea de comandos) y no el protocolo en si.

Bien ahora sabiendo esto, como podria obtener un listado de los achivos que hay en el servidor, alguna idea??

Gracias por tu respuesta
  #4 (permalink)  
Antiguo 02/01/2011, 19:54
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: ftp via sockets

Hola lair,

El protocolo indica que el comando es LIST o NLST, en los programas de ftp se reemplaza del lado del cliente por 'ls' o 'dir' por la familiaridad con el sistema operativo.

http://www.faqs.org/rfcs/rfc959.html
http://www.rfc-es.org/rfc/rfc0959-es.txt

Saludos,
  #5 (permalink)  
Antiguo 02/01/2011, 20:00
Avatar de lair  
Fecha de Ingreso: enero-2009
Ubicación: header('Location: Morelia");
Mensajes: 1.052
Antigüedad: 15 años, 3 meses
Puntos: 46
Respuesta: ftp via sockets

Si, gracias de hecho estaba checando el rfc pero cuando coloco LIST o NLST me responde con:
Cita:
425 Unable to build data connection: Argumento inválido
y cuando escribo HELP LIST o HELP NLST
me dice lo siguiente:
Cita:
214 Syntax: NLST [<sp> (pathname)]
en ambos casos, solo que no se que es eso de <sp>.

Gracias por la ayuda.
  #6 (permalink)  
Antiguo 02/01/2011, 20:22
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: ftp via sockets

Hola,

Mmmm ... el error 425 es que no se pudo establecer una conexión, posiblemente es el modo activo/pasivo de la conexión ftp u otros. Posiblemente acá encuentres mas información sobre la 'conexión de espera' : http://support.microsoft.com/kb/129395/es .

Aparte del puerto 23, FPT usa otros puertos que deben estar abiertos en el firewall.

Saludos,

ps:

<sp> me imagino que será 'space' (espacio vacío). Creo que es muy común ver ese tipo de cosas en los RFC, eso fue escrito en 1985 y no era 'tan' evidente que había que dejar un espacio vacío.
  #7 (permalink)  
Antiguo 02/01/2011, 21:58
Avatar de lair  
Fecha de Ingreso: enero-2009
Ubicación: header('Location: Morelia");
Mensajes: 1.052
Antigüedad: 15 años, 3 meses
Puntos: 46
Respuesta: ftp via sockets

Bueno, creo que necesito leer mas por que me estoy dando cuenta de que no es el firewall que me este bloqueando puertos, debido a que si utilizo algun cliente, filezilla, fireftp o incluso desde consola todo funciona perfecto, el problema es cuando lo hago a traves de telnet o mi aplicacion; esto aun siguiendo lo que hacen filezilla y fireftp

Esta es la salida del fireftp (plug-in de firefox)
Código fireftp:
Ver original
  1. 220 FTP Server ready.
  2.        USER home
  3. 331 Password required for home
  4.        PASS (password not shown)
  5. 230 User home logged in
  6.        FEAT
  7. 211-Features:
  8. MDTM
  9. MFMT
  10. LANG ru-RU;ja-JP;ko-KR;en-US;zh-TW;fr-FR;it-IT;zh-CN;bg-BG
  11. TVFS
  12. UTF8
  13. MFF modify;UNIX.group;UNIX.mode;
  14. MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*;
  15. REST STREAM
  16. SIZE
  17. 211 End
  18.        OPTS UTF8 ON
  19. 200 UTF8 set to on
  20.        PWD
  21. 257 "/" is the current directory
  22.        TYPE A
  23. 200 Type set to A
  24.        PASV
  25. 227 Entering Passive Mode (192,168,2,101,238,55).
  26.        LIST
  27. 150 Opening ASCII mode data connection for file list
  28. 226 Transfer complete

si sigo esos pasos (que a demas son los mismos que el filezilla) obtengo lo mismo, hasta que llego a la parte donde hago el cambio a pasivo, al ejecutar el comando se queda trabado tanto telnet como la aplicacion.

Gracias por tu tiempo, seguire investigando.
  #8 (permalink)  
Antiguo 02/01/2011, 22:22
Avatar de lair  
Fecha de Ingreso: enero-2009
Ubicación: header('Location: Morelia");
Mensajes: 1.052
Antigüedad: 15 años, 3 meses
Puntos: 46
Respuesta: ftp via sockets

OK, ya logre listar el contenido del directorio, explico el procedimiento.

1) nos conectamos a nuestro servidor ftp por el puerto asignado (generalmente 21)
2) nos autentificamos linea 2 y 4 del post anterior.
3) entrar en modo pasivo linea 24.

y aqui es donde viene lo interesante, en la salida de este comando PASV (linea 24) obtenemos algo como:
227 Entering Passive Mode (192,168,2,101,238,55).

FTP maneja dos puertos, uno para "el trafico de comandos (texto)" por decirlo de alguna manera y otro para el manejo de datos, como seria la transferencia de archivos o como en mi caso el resultado de un comando. bien ahora entremos en materia.

de esa salida (192,168,2,101,238,55) los primeros 4 bloques es la IP y los ultimos dos son el puerto, pero estos hay que unificarlos (no se exactamente como llamar a ese proceso), pero se hace de la siguiente manera.

238 en hexadecimal es => EE
55 en hexadecimal es => 37

ahora el numero hexadecimal que tenemos es: 0xEE37 el cual en decimal equivale a 60983 y este es nuestro puerto de recepcion, para esto se abre OTRA conexion con el servidor en mi caso telnet (A.B.C.D 60983) o en el de mi aplicacion (A.B.C.D:60983) y ahi es donde aparese casi por arte de magia el resultado del comando que habiamos tecleado en la otra conexion, llamada conexion de control.

Espero les sirva esta informacion, ya que no hay mucha en linea.

Suerte y gracias HackmanC Saludos y prospero año.

Etiquetas: ftp, sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:41.