554
« en: 17 de Septiembre 2015, 09:54 »
Hola Lorenzo!
Se trata de una aportación valiosa porque se practica con muchos conceptos interesantes. Con tu permiso voy a trasladar el código que has creado para que esté visible dentro del hilo del foro y las personas que lo vean puedan hacerse una idea sobre el código sin tener que descargar el fichero como adjunto.
Clase FicheroServidor:
import java.io.*;
import java.net.*;
/**
* Servidor envio archivos a usuarios
*
* @author Lorenzo31
* @version (a version number or a date)
*/
public class FicheroServidor
{
public static final int PORT = 4444;
public static void main (String args[]) throws IOException {
ServerSocket servidor = null;
Socket cliente;
BufferedReader entrada = null;
//PrintWriter salida = null;
OutputStream sendChannel = null;
String cadena = ""; String comando = "";
try{ servidor = new ServerSocket(PORT);
}catch(IOException e){System.out.println("Error al conectar con el servidor"); System.exit(-1);}
/* Se bloquea mientras escucha */
System.out.println("Servidor escuchando: " + servidor + " " + servidor.getInetAddress());
cliente = servidor.accept();
while(!cliente.isClosed()){ //mientras sea distinto a close, sigue escuchando al usuario
try{
//Establece canal de entrada
entrada = new BufferedReader (new InputStreamReader(cliente.getInputStream()));
//Establece canal envio archivos
sendChannel = cliente.getOutputStream();
//lectura entrada usuario
cadena = entrada.readLine();
} catch(IOException e ) { System.out.println(e.getMessage()); }
System.out.println("Buscando archivo solicitado en comando:" + cadena);
//bucle for quita espacios a la cadena de entrada y lo guarda en comando
for (int x = 0; x < cadena.length(); x++){
if(!cadena.substring(x, x+1).equals(" ") && !cadena.substring(x, x+1).equals("\"")){ comando = comando + cadena.substring(x, x+1); }/*final for*/ }
cadena = comando.substring(0, 3); //reasignamos a la cadena de entrada solo las 3 letras de la orden del usuario
switch(cadena){ //coge los tres caracteres primeros y compara si es bye, get o otro que en ese caso no seria valido
case "bye": System.out.println("Finalizada la conexion con el cliente."); cliente.close(); break;
case "get": //crea instancia de clase buscar archivo y invoca a la funcion buscador para encontrar el archivo solicitado
BuscarArchivo find = new BuscarArchivo();
File archivoEncontrado = find.buscador(comando.substring(3, comando.length() ), new File("C:\\"));
if(archivoEncontrado != null){ //si es null no encontró el archivo sino sí que lo manda
new HiloEnvio (cliente, archivoEncontrado).start(); } else { sendChannel.write(-1); }
cadena = ""; comando = "";
break;
default: sendChannel.write(-1); cadena = ""; comando = ""; //envio archivo vacio comando mal introducido
}
}
}
}
Clase HiloEnvio:
import java.net.*;
import java.io.*;
/**
* Write a description of class HiloEnvio here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class HiloEnvio extends Thread
{
private File archivo;
private Socket socketCliente = null;
private FileInputStream fileChannel = null;
private BufferedInputStream lectorArchivo = null;
private OutputStream sendChannel = null;
public HiloEnvio(Socket socketCliente, File archivo){ this.socketCliente = socketCliente; this.archivo = archivo; }
public void run() {
// envio de file
try{
byte [] mybytearray = new byte [(int)archivo.length()];
fileChannel = new FileInputStream(archivo);
lectorArchivo = new BufferedInputStream(fileChannel);
lectorArchivo.read(mybytearray,0,mybytearray.length);
sendChannel = socketCliente.getOutputStream();
System.out.println("Sending " + archivo + "(" + mybytearray.length + " bytes)");
sendChannel.write(mybytearray,0,mybytearray.length);
sendChannel.flush();
System.out.println("Done.");
}catch (IOException | NullPointerException e) { System.out.println("Interrumpido. ");
interrupt();}
}
}
Clase BuscarArchivo
import java.io.*;
import java.net.*;
/**
* Write a description of class BuscarArchivo here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class BuscarArchivo
{
File archivoEncontrado = null; //si retorna null es que no lo ha encontrado
public BuscarArchivo() { }
public File buscador(String nombre, File raiz){
File[] lista = raiz.listFiles();
if(lista != null) {
for(File elemento : lista) {
if (elemento.isDirectory()) { //si es directorio vuelve a llamarse a si misma
buscador(nombre, elemento);
} else if (nombre.equalsIgnoreCase(elemento.getName())) //sino, si es igual encontrado
{ archivoEncontrado = elemento; System.out.println("Archivo encontrado.");}
}
}
return archivoEncontrado;
} //cierre buscador
}
Clase FicheroCliente
import java.io.*;
import java.net.*;
/**
* Write a description of class FicheroCliente here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class FicheroCliente
{
public static void main(String[] args) throws IOException {
int bytesRead;
OutputStream fos = null;
BufferedOutputStream bos = null;
Socket socketCliente = null;
PrintWriter salida = null;
String hostName = InetAddress.getLocalHost().getHostName();
/* Creamos un socket en el lado cliente, enlazado con un servidor que está en la misma máquina
que el cliente y que escucha en el puerto 4444 */
try{ socketCliente = new Socket(hostName, 4444);
System.out.println("servidor conectado:" + hostName);
//Obtenemos el canal de salida
salida = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socketCliente.getOutputStream())),true);
}catch(IOException e){
System.err.println("No puede establecer conexion");
System.exit(-1); }
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String linea = "";
/*El programa cliente no analiza los mensajes enviados por el usuario, simplemente los
* reenvia al servidor hasta que este se despide con Adios*/
while(!linea.equalsIgnoreCase("bye")){
do{
System.out.println("Intrude comando válido:");
//Leo la entrada del usuario
linea = stdIn.readLine();
}while (!linea.matches("[a-z][a-z][a-z] \".*\"") && !linea.equalsIgnoreCase("bye"));
//La envia al servidor
salida.println(linea);
try {
//reciibr archivo
//Creamos array de bytes
byte [] mybytearray = new byte [66666];
//Creamos objeto InputStream que abre la cadena de entrada para lectura del fichero que mande servidor
InputStream cadenaReceptor = socketCliente.getInputStream();
fos = new FileOutputStream("C:/Documents and Settings/Admin/Desktop/llegada.txt");
bos = new BufferedOutputStream(fos); //lee donde va a escribir
bytesRead = cadenaReceptor.read(mybytearray,0,mybytearray.length);
if(bytesRead == 1){ //1 valor que toma como mínimo un archivo Outputstream, significa archivo no encontrado o no buscado
System.out.println("Archivo no encontrado o comando erroneo");
} else if(bytesRead == -1){ System.out.println("Sesion finalizada"); } //-1 valor que toma al no recibir ningun archivo erroneo ni correcto, solo con BYE
else { bos.write(mybytearray, 0 , bytesRead); //buffer escribe en el archivo asignado
bos.flush();
System.out.println("File " + "C:/Documents and Settings/Admin/Desktop/llegada.txt"
+ " downloaded (" + bytesRead + " bytes read)"); }
}catch(IOException e){ System.out.println("Error en la transmisión.");
if (fos != null) fos.close();
if (bos != null) bos.close();
if (socketCliente != null) socketCliente.close(); }
}
if (fos != null) fos.close();
if (bos != null) bos.close();
if (socketCliente != null) socketCliente.close();
}
}