Logo 
Search:

Java Forum

Ask Question   UnAnswered
Home » Forum » Java       RSS Feeds

Realizar cliente FTP/TCP

  Asked By: Apariencia    Date: Nov 07    Category: Java    Views: 2444
  


Realizar un cliente FTP/TCP que interactúe con el servidor anterior,
ServidorFTP_TCP1.
La invocación se realizará a través de argumentos:
· primer argumento, máquina destino
· segundo argumento, petición
· tercer argumento, si procede, nombre del fichero a subir o bajar
Ejemplos: (argumento)
java ClienteFTP_TCP localhost dir
java ClienteFTP_TCP di012.edv.uniovi.es get prueba.txt
java ClienteFTP_TCP 156.35.160.12 put prueba.txt
Después de realizar una operación en el sitio FTP finaliza su conexión.
Modificar ServidorFTP_TCP1 que se pueda probar con el cliente FTP/TCP
realizado anteriormente.
· debe utilizar 3 threads para atender constantemente peticiones de clientes
de forma simultánea.

<<<<<<<<<<<<<<<<<CODIGO SERVIDOR FTC_TCP1>>>>>>>>>>>>>>>>>>>
import java.net.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import java.io.*;


public class ServidorFTP_TCP1 {
protected ServerSocket SSocketEscucha;
protected Socket SocketPeticion;
protected DataInputStream EntradaBytes;
protected BufferedOutputStream SalidaBytes;
protected BufferedReader EntradaTexto;
protected PrintWriter SalidaTexto;


public static void main(String args[]) {
ServidorFTP_TCP1 serv= new ServidorFTP_TCP1();
serv.run();
} // main

public ServidorFTP_TCP1() { // constructor
try {
SSocketEscucha = new ServerSocket(7777);
System.out.println("ServidorFTP_TCP created at port "+ SSocketEscucha.getLocalPort());
} catch (IOException e) { System.out.println(e); }
}// constructor ServidorFTP_TCP1

public void run() {
String peticion;
String[] comandos;
String nombrefichero;
long tamaño;
boolean finalizar = false;

while(!finalizar) {
try { // esperar peticiones de los clientes
System.out.println("ServidorFTP_TCP esperando peticiones");
SocketPeticion = SSocketEscucha.accept();
EntradaBytes = new DataInputStream(SocketPeticion.getInputStream());
SalidaBytes= new BufferedOutputStream(SocketPeticion.getOutputStream());
EntradaTexto = new BufferedReader(new InputStreamReader(SocketPeticion.getInputStream()));
SalidaTexto = new PrintWriter(SocketPeticion.getOutputStream(), true);
System.out.println("ServidorFTP_TCP, peticion de "+SocketPeticion.getInetAddress());
peticion = EntradaTexto.readLine();
comandos= peticion.split("");
switch (comandos[0]) {
case "DIR":
ListarFTP();
break;
case "PUT":
nombrefichero = comandos[1];
tamaño = Integer.parseInt(comandos[2]);
RecibirFichero(nombrefichero, tamaño);
break;
case "GET":
nombrefichero = comandos[1];
EnviarFichero(nombrefichero);
break;
default:
System.out.println(comandos[0] + "no identificado");
break;
} // switch
SocketPeticion.close();
} catch(Exception e) {
System.out.println("Excepcion: " + e);
finalizar=true;
}
System.out.println("ServidorFTP_TCP, fin peticion");
}// while(!finalizar)
} // run

void ListarFTP() {
int i;
File nomdir= new File(".");
File[] listfich= nomdir.listFiles();
try {
// enviar la lista de ficheros
for(i= 0; i < listfich.length; i++)
if (listfich[i].isFile())
SalidaTexto.println(listfich[i].getName());
SalidaTexto.println("#FIN#");
SalidaTexto.flush();
} catch(Exception e) {
System.out.println("Error en el listado del sitio FTP: "+e);
}
} // ListarFTP

void EnviarFichero(String nombrefichero) {
File fich= new File(nombrefichero);
String respuesta;
long tamaño;
try {

if(fich.isFile()) {
tamaño = fich.length(); // obtener el tamaño del fichero
SalidaTexto.println("OK" + tamaño); // enviar contestación
SalidaTexto.flush();
respuesta = EntradaTexto.readLine();
EnviarBytes (fich, tamaño); // enviar el fichero
} else {
SalidaTexto.println("ERROR");
}
} catch(Exception e) {
System.out.println("Error en el envio del fichero: " + e);
}
} // EnviarFichero

void EnviarBytes(File fich, long size) {
try {
BufferedInputStream fichbis= new BufferedInputStream(new FileInputStream(fich));
/*
// lee el fichero byte a byte
int dato;
System.out.println("leo el fichero byte a byte ");
for(long i= 0; i< size; i++) {
dato = fichbis.read();
SalidaBytes.write(dato);
}
*/
/*
// lee el fichero por bloques de bytes
int leidos= 0;
byte[] buffer= new byte [1024];
System.out.println("leo el fichero por bloques de bytes ");
while (leidos!=-1) {
leidos= fichbis.read (buffer);
if (leidos!=-1)
SalidaBytes.write (buffer, 0, leidos);
}
*/
// lee el fichero completo de golpe
DataInputStream fichdis= new DataInputStream (fichbis);
System.out.println("leo el fichero completo de golpe ");
byte[] buffer= new byte [(int) fich.length()];
fichdis.readFully (buffer);
SalidaBytes.write (buffer);
SalidaBytes.flush();
fichbis.close();
} catch(Exception e) {
System.out.println("Error en el envio del fichero binario: "+e);
}
} // EnviarBytes

void RecibirFichero(String nombrefichero, long tamano) {
try {
// leer el tamaño del fichero
SalidaTexto.println("READY"); // enviar comando READY al cliente
SalidaTexto.flush();
RecibirBytes(nombrefichero, tamano);
} catch(Exception e) {
System.out.println("Error en la recepción del fichero: " + e);
}
} // RecibirFichero

void RecibirBytes(String nomfich, long size){
int dato;
nomfich="copiaenservidor_"+nomfich;
System.out.println("cambio nombre fichero a: "+nomfich);
try {
BufferedOutputStream fichbos= new BufferedOutputStream(new FileOutputStream(nomfich));
for(long i= 0; i<size; i++) {
dato = EntradaBytes.readByte();
fichbos.write(dato);
}
fichbos.close();
} catch(Exception e) {
System.out.println("Error en la recepcion del fichero binario: " + e);
}
} // RecibirBytes
}

Share: 



Tagged: