Salve,
sono disperato!
Il prof ci ha dato un esercizio da fare a casa in una settimana ed io sono proprio nel pallone! se non mi date una mano non ce la faro mai!!!!! Se non ce la faccio non potrò dare l'esame! :'(
Ecco la Traccia!
codice:
Fornire l'implementazione della classe NeilsenMizuno che estende la classe astratta DAComponent
e che implementa l'omonimo algoritmo per la mutua esclusione distribuita.
La suddetta classe deve:
* far parte del pacchetto org.ml.pr0708.mat[numerodimatricola].nm
* interagisce con le altri componenti utilizzando i metodi del campo server. Allo scopo dovranno essere implementati le
opportune estensioni delle classi PacketFactory e Packet,
hiamate NMPacketFactory e NMPacket e appartenenti allo stesso della classe fornita, che descrivono
i pacchetti dell'algoritmo richiesto.
* fornisce un solo costruttore public che prende come argomenti (nell'ordine):
o un oggetto di tipo Server da utilizzare per invocare il costruttore della classe base
o un oggetto di tipo SocketAddress che server ad identificare il padre del nodo al momento. Questo valore sarà null se la
componente che viene costruita possiede il token
* fornisce i metodi doEnter e doLeave che, rispettivamente, implementano le funzionalità per accedere ed uscire dalla sezione critica
* fornire il metodo doStart che avvia gli opportuni Thread necessari ad implementare l'algoritmo.
I sorgenti devono essere consegnati all'interno di un file jar contenente che:
* ha nome <matricola>.jar
* contiene una cartella <matricola> contenente i soli sorgenti sottomessi dallo studente opportunamente strutturati per rispettare la gerarchia dei pacchetti
Seguendo il corso, con l'aiuto del prof abbiamo preparato queste classi!
Qualsiasi consiglio ed aiuto e bene accetto
codice:
/**
*
*/
package org.ml.pr0708.da;
import java.io.IOException;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.Channel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.LinkedList;
import org.ml.pr0708.da.SyncServer.ServerThread;
/**
* @author loreti
*
*/
public class AsyncServer implements Server {
private static int RETRY=10;
private LinkedList<Packet> queue;
private SocketAddress address;
private PacketFactory factory;
public AsyncServer( PacketFactory factory , SocketAddress address ) {
this.address = address;
this.queue = new LinkedList<Packet>();
this.factory = factory;
}
private synchronized void addPacket( Packet p ) {
queue.add(p);
notifyAll();
}
public synchronized void read( Packet p ) throws InterruptedException {
while (true) {
for (Packet b : queue) {
if (p.match(b)) {
queue.remove(b);
return ;
}
}
wait();
}
}
public void send( Packet p , SocketAddress dest ) throws IOException {
boolean flag = true;
SocketChannel c = null;
while (flag) {
try {
c = SocketChannel.open(dest);
flag = false;
} catch (ConnectException e) {
}
}
ByteBuffer b = p.createBuffer();
c.write(b);
c.close();
}
public void start() {
try {
Selector selector = Selector.open();
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ssc.socket().bind(address);
ssc.register(selector, SelectionKey.OP_ACCEPT);
Thread t = new Thread(new ServerThread(selector));
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public class ServerThread implements Runnable {
private Selector selector;
public ServerThread(Selector selector) {
this.selector = selector;
}
public void run() {
try {
while (true) {
selector.select();
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
it.remove();
handleKey( key );
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void handleKey(SelectionKey key) throws IOException {
if (key.isValid()&&key.isAcceptable()) {
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel client = ssc.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
return ;
}
if (key.isValid()&&key.isReadable()) {
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer b = factory.getByteBuffer();
client.read(b);
b.flip();
addPacket(factory.createPacket(b));
client.close();
}
}
}
}
codice:
package org.ml.pr0708.da;
public class Controller {
private static Controller c = null;
public static Controller getInstance() {
if (c==null) {
c = new Controller();
}
return c;
}
private boolean free = true;
private int current = 0;
public synchronized void enter(int id) {
if (free) {
free = false;
current = id;
} else {
System.err.println("Nodes ( "+current+" ) and ( "+id+" ) are both in critical section!!!!");
System.exit(-1);
}
}
public synchronized void exit() {
free = true;
current = -1;
}
}
codice:
/**
*
*/
package org.ml.pr0708.da;
import java.nio.ByteBuffer;
/**
* @author loreti
*
*/
public abstract class Packet {
protected abstract int packetSize();
protected abstract boolean match( Packet p );
public abstract ByteBuffer createBuffer();
}
codice:
/**
*
*/
package org.ml.pr0708.da;
import java.nio.ByteBuffer;
/**
* @author loreti
*
*/
public interface PacketFactory {
public ByteBuffer getByteBuffer();
public Packet createPacket(ByteBuffer b);
}
codice:
package org.ml.pr0708.da;
import java.io.IOException;
import java.net.SocketAddress;
public interface Server {
public abstract void read(Packet p) throws InterruptedException;
public abstract void send(Packet p, SocketAddress dest) throws IOException;
public abstract void start();
}
codice:
/**
*
*/
package org.ml.pr0708.da;
import java.io.IOException;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.LinkedList;
/**
* @author loreti
*
*/
public class SyncServer implements Server {
private static int RETRY=10;
private LinkedList<Packet> queue;
private SocketAddress address;
private PacketFactory factory;
public SyncServer( PacketFactory factory , SocketAddress address ) {
this.address = address;
this.queue = new LinkedList<Packet>();
this.factory = factory;
}
private synchronized void addPacket( Packet p ) {
queue.add(p);
notifyAll();
}
/* (non-Javadoc)
* @see org.ml.pr0708.da.Server#read(org.ml.pr0708.da.Packet)
*/
public synchronized void read( Packet p ) throws InterruptedException {
while (true) {
for (Packet b : queue) {
if (p.match(b)) {
queue.remove(b);
return ;
}
}
wait();
}
}
/* (non-Javadoc)
* @see org.ml.pr0708.da.Server#send(org.ml.pr0708.da.Packet, java.net.SocketAddress)
*/
public void send( Packet p , SocketAddress dest ) throws IOException {
boolean flag = true;
SocketChannel c = null;
while (flag) {
try {
c = SocketChannel.open(dest);
flag = false;
} catch (ConnectException e) {
}
}
ByteBuffer b = p.createBuffer();
c.write(b);
c.close();
}
/* (non-Javadoc)
* @see org.ml.pr0708.da.Server#start()
*/
public void start() {
Thread t = new Thread(new ServerThread());
t.start();
}
public class ServerThread implements Runnable {
public void run() {
try {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.socket().bind(address);
while (true) {
SocketChannel client = ssc.accept();
Thread t = new Thread( new Reader(client) );
t.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Reader implements Runnable {
private SocketChannel channel;
public Reader(SocketChannel channel) {
this.channel = channel;
}
public void run() {
ByteBuffer b = factory.getByteBuffer();
try {
channel.read(b);
b.flip();
addPacket(factory.createPacket(b));
channel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}