Cliente – Suministrador
Vamos a crear un suministrador que facilita datos y un cliente que los consume (o un productor y un consumidor).
Problema Productor – Consumidor
Diagrama del proceso cliente-suministrador:
File file = new File("test.txt"); FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); FileLock lock = channel.lock(); // Acceso al fichero lock.release(); channel.close();
Cliente:
import java.io.File; import java.io.RandomAccessFile; import java.io.PrintStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.nio.channels.FileLock; public class Cliente { /** * @param args Argumentos de la línea de comando * El primer argumento pasado, será la ruta del fichero */ public static void main(String[] args) { String nombreFichero = ""; File archivo = null; RandomAccessFile raf = null; FileLock bloqueo = null; int cuenta = 1; int valor; /* try{ //Rediregimos salida y error estándar a un fichero PrintStream ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(new File("javalog_cliente.txt"),true)), true); System.setOut(ps); System.setErr(ps); } catch(Exception e){ System.err.println("Cliente. No he podido redirigir salidas."); } */ if (args.length > 0) nombreFichero = args[0]; //Hemos recibido la ruta del fichero en la línea de comandos else nombreFichero = "/home/usuario/buffer.txt"; //Fichero que se utilizará por defecto //Preparamos el acceso al fichero archivo = new File(nombreFichero); while (cuenta <= 10) {//leeremos 10 datos try { raf = new RandomAccessFile(archivo, "rwd"); //Abrimos el fichero //*************** //Sección crítica //Fin sección crítica //******************* Thread.sleep(2000);//simulamos tiempo de procesamiento del dato } catch (Exception e) { System.err.println("Cliente. Error al acceder al fichero."); System.err.println(e.toString()); } finally { try { if (bloqueo != null) bloqueo.release(); if (raf != null) raf.close(); } catch (Exception e2) { System.err.println("Cliente. Error al cerrar el fichero."); System.err.println(e2.toString()); System.exit(1); //Si hay error, finalizamos } } } } }
Suministrador:
import java.io.File; import java.io.RandomAccessFile; import java.io.PrintStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.nio.channels.FileLock; public class Suministrador { /** * @param args Argumentos de la línea de comando * El primer argumento pasado, será la ruta del fichero */ public static void main(String[] args) { String nombreFichero = ""; File archivo = null; RandomAccessFile raf = null; FileLock bloqueo = null; int i = 1; /* try{ //Rediregimos salida y error estándar a un fichero PrintStream ps = new PrintStream( new BufferedOutputStream(new FileOutputStream( new File("javalog_suministrador.txt"),true)), true); System.setOut(ps); System.setErr(ps); } catch(Exception e){ System.err.println("Suministrador. No he podido redirigir salidas."); } */ if (args.length > 0) nombreFichero = args[0]; //Hemos recibido la ruta del fichero en la línea de comandos else nombreFichero = "/home/usuario/buffer.txt"; //Fichero que se utilizará por defecto //Preparamos el acceso al fichero archivo = new File(nombreFichero); while (i <= 10) {//escribiremos 10 datos try { raf = new RandomAccessFile(archivo, "rwd"); //Abrimos el fichero //*************** //Sección crítica //Fin sección crítica //******************* Thread.sleep(1000); //Simulamos tiempo de creación del dato } catch (Exception e) { System.err.println("Suministrador. Error al acceder al fichero."); System.err.println(e.toString()); } finally { try { if (bloqueo != null) bloqueo.release(); if (raf != null) raf.close(); } catch (Exception e2) { System.err.println("Suministrador. Error al cerrar el fichero."); System.err.println(e2.toString()); System.exit(1); //Si hay error, finalizamos } } } } }
Abrir en una consola el cliente:
javac Cliente.java java Cliente numeros.txt
y en otra el suministrador:
javac Suministrador.java java Suministrador numeros.txt
¿Qué ocurre al lanzar varios clientes?
Mejora: terminar los clientes cuando el sumistrador haya terminado de producir datos.
Mejora: Realizar en IntelliJ IDEA el Cliente-Suministrador y proporcionar un menú para lanzar procesos: 1 suministrador (como máximo) y varios clientes.
Tarea online de la unidad 1
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.