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.