Hallo. Ich möchte verteilte Anwendungen reservieren, wobei die Clienten als Konsumenten, die auf einen serverseitigen Puffer zugreifen, auftreten. Realisiert wird die Kommunikation über die RMI-Schnittstelle.
Der Server besitzt zudem einen Produzent, der den Puffer füllt. Die maximale Puffergröße ist 20.
Die Aufgabe habe ich mir selbst zusammengestellt und sollte nur dazu dienen, den Wissensstand zu überprüfen. Bitte die Ausführungen der Ausnahmebehandlungen, wie sie im Code auftreten, unberücksichtigt lassen und voraussetzen, dass die Objekte serverseitig registriert wurden.
Vielen Dank im Voraus!
Der Server besitzt zudem einen Produzent, der den Puffer füllt. Die maximale Puffergröße ist 20.
Die Aufgabe habe ich mir selbst zusammengestellt und sollte nur dazu dienen, den Wissensstand zu überprüfen. Bitte die Ausführungen der Ausnahmebehandlungen, wie sie im Code auftreten, unberücksichtigt lassen und voraussetzen, dass die Objekte serverseitig registriert wurden.
Vielen Dank im Voraus!
Java:
public class Buffer
{
private Vector<Integer> buffer;
private Semaphor mutex;
private boolean flag1;
private boolean flag2;
public Buffer()
{
buffer = new Vector<Integer> buffer;
mutex = new Semaphor(1);
flag1 = false;
flag2 = false;
}
public synchronized Integer get()
{
if (buffer.size() == 0)
{
flag1 = true;
if(flag2)
{
notify();
}
try
{
wait();
} catch(Exception e)
{}
}
mutex.p();
Integer temp = buffer.lastElement();
buffer.remove(temp);
mutex.v();
return temp;
}
public synchronized void put(Integer a)
{
if (buffer.size() == 20)
{
flag2 = true;
if(flag1)
{
notify();
}
try
{
wait();
} catch(Exception e)
{}
}
mutex.p();
buffer.add(a);
mutex.v();
}
}
public interface Consumer extends Remote
{
public Integer get() throws RemoteException;
}
public class ConsumerImpl extends UnicastRemoteObject implements Consumer
{
private Buffer buffer;
public ConsumerImpl(Buffer buff) throws RemoteException
{
buffer = buff;
}
public Integer get() throws RemoteException
{
return buffer.get();
}
}
public class Producer extends Thread
{
private Buffer buffer;
public Producer(Buffer buff)
{
buffer = buff;
this.start();
}
public void run()
{
Integer a = 0;
while (true)
{
buffer.put(a);
try
{
sleep(1000);
}
catch (Exception e) {}
}
}
}
public class Server
{
public static void main(String[] args)
{
try
{
Buffer buffer = new Buffer();
ConsumerImpl c1 = new ConsumerImpl(buffer);
Producer prod = new Producer(buffer);
Naming.rebind("Server1", c1);
}
catch(Exception e)
{
return;
}
}
}
public class Client_J
{
public static void main(String[] args)
{
try
{
Consumer c1 = (Consumer) Naming.lookup("rmi://" + args[0] + "/Server1");
while(true)
{
System.out.println(c1.get());
}
}
catch(Exception e)
{
return;
}
}
}