import java.io.*;
import java.net.*;
import java.util.*;
public class Miftp
{
static String pasivo;
static int puertop;
public static void CogeRespuesta(DataInputStream is)
{
String salidaSocket;
try
{
do
{
salidaSocket = is.readLine( );
System.out.println(salidaSocket);
}
while (!(Character.isDigit(salidaSocket.charAt(0)) && Character.isDigit(salidaSocket.charAt(1)) && Character.isDigit(salidaSocket.charAt(2)) && salidaSocket.charAt(3) == ' '));
System.out.println("**");
pasivo = salidaSocket;
}
catch (IOException e)
{
System.out.println("Error al intentar obtener la respuesta desde el puerto de control");
}
}
public static boolean EnviarFichero(String comando, DataInputStream entradaPuertoControl, PrintStream salidaPuertoControl)
{
try
{
OutputStream sout;
byte b[] = new byte[1024];
salidaPuertoControl.println("type i");
CogeRespuesta(entradaPuertoControl);
salidaPuertoControl.println("pasv");
CogeRespuesta(entradaPuertoControl);
deco(pasivo);
Socket sokser = new Socket(pasivo,puertop);
salidaPuertoControl.println(comando);
CogeRespuesta(entradaPuertoControl);
StringTokenizer stringtokens = new StringTokenizer(comando);
stringtokens.nextToken();
String NombreFichero = stringtokens.nextToken();
System.out.println(NombreFichero);
RandomAccessFile FicheroEntrada = new RandomAccessFile(NombreFichero, "r");
sout = sokser.getOutputStream();
int longitud;
while ((longitud = FicheroEntrada.read(b)) > 0)
{
sout.write(b, 0, longitud);
}
FicheroEntrada.close();
sout.close();
sokser.close();
CogeRespuesta(entradaPuertoControl);
}
catch(IOException e)
{
System.out.println(e);
}
return(true);
}
public static void PuertoDeDatos(String comando, boolean salvar, DataInputStream entradaPuertoControl, PrintStream salidaPuertoControl)
{
try
{
InputStream insoc;
byte b[] = new byte[1024];
salidaPuertoControl.println("type i");
CogeRespuesta(entradaPuertoControl);
salidaPuertoControl.println("pasv");
CogeRespuesta(entradaPuertoControl);
deco(pasivo);
Socket sokser = new Socket(pasivo,puertop);
salidaPuertoControl.println(comando);
CogeRespuesta(entradaPuertoControl);
insoc = sokser.getInputStream();
int longitud;
if(salvar)
{
StringTokenizer stringtokens = new StringTokenizer(comando);
stringtokens.nextToken();
String NombreFichero = stringtokens.nextToken();
System.out.println(NombreFichero);
RandomAccessFile FicheroSalida = new RandomAccessFile(NombreFichero, "rw");
while ((longitud = insoc.read(b)) > 0)
{
FicheroSalida.write(b, 0, longitud);
}
FicheroSalida.close();
}
else
{
while((longitud = insoc.read(b)) != -1)
System.out.write(b, 0, longitud);
}
insoc.close();
sokser.close();
CogeRespuesta(entradaPuertoControl);
}
catch(IOException e)
{
System.out.println(e);
}
}
public static void deco(String st)
{
int a = st.length();
String sl = "", n1 = "", n2 = "";
char q;
for(int i = 0; i < a; i++)
{
q = st.charAt(i);
if(q == '(')
{
st = st.substring(i+1, a-1);
i = a;
}
}
int b = 0;
a = st.length();
for(int i = 0; i < a; i++)
{
q = st.charAt(i);
if(b < 4)
{
if(q == ',')
{
sl = new String(sl+".");
b = b+1;
}
else
{
sl = new String(sl+q);
}
}
else if(b == 4)
{
if(q == ',')
b = b+1;
else
n1 = new String(n1+q);
}
else if(b > 4)
{
n2 = new String(n2+q);
}
}
int c = sl.length();
pasivo = sl.substring(0, c-1);
puertop = ((Integer.valueOf(n1).intValue())*256)+(Integer.valueOf(n2).intValue());
}
public static void main(String[] args)
{
if(args.length != 1)
{
System.out.println("Use El Comnado : java Miftp Host");
System.exit(1);
}
Socket miSocket = null;
PrintStream os = null;
DataInputStream is = null;
DataInputStream stdIn = new DataInputStream(System.in);
try
{
miSocket = new Socket(args[0], 21);
os = new PrintStream(miSocket.getOutputStream());
is = new DataInputStream(miSocket.getInputStream());
}
catch (UnknownHostException e)
{
System.err.println("Host Desconocido : "+args[0]);
}
catch (IOException e)
{
System.err.println("No se puede abrir una conexión con el host: " +args[0]);
}
if (miSocket != null && os != null && is != null)
{
try
{
String entradaUsuario;
CogeRespuesta(is);
while ((entradaUsuario = stdIn.readLine()) != null)
{
if(entradaUsuario.startsWith("list") || entradaUsuario.startsWith("nlst"))
PuertoDeDatos(entradaUsuario, false, is, os);
else if(entradaUsuario.startsWith("retr"))
PuertoDeDatos(entradaUsuario, true, is, os);
else if(entradaUsuario.startsWith("stor") || entradaUsuario.startsWith("stou"))
EnviarFichero(entradaUsuario, is, os);
else if(entradaUsuario.startsWith("exit"))
break;
else
{
os.println(entradaUsuario);
CogeRespuesta(is);
}
}
os.close();
is.close();
miSocket.close();
}
catch (IOException e)
{
System.err.println("E/S fallo en la conexión a : "+ args[0]);
}
}
}
}