luxorl
07-07-2007, 17:12
Ciao a tutti, di seguito riporto la traccia di un esercizio di un vecchio appello di reti di calcolatori della mia università:
Si vuole realizzare un’applicazione Director capace di gestire una serie di attività eseguibili parallelamente.
Il sistema è composto da un coordinatore centrale, chiamato Master, e da un numero N di macchine,
chiamate Slave, che eseguono tutte lo stesso tipo di attività. Ogni Slave può eseguire una sola attività. Il
Master attende la richiesta di un client e, una volta ricevuta, individua se possibile uno Slave libero e lo
contatta per dare inizio all’attività. Se tutte le macchine Slave sono occupate il Master risponde
immediatamente al client inviando la stringa “SYSTEM BUSY”.
Per avviare l’attività di una macchina Slave, il Master deve semplicemente inviargli la stringa “START
ACTIVITY”. Il Master attende la fine dell’attività della macchina Slave e poi avvisa il client inviando la
stringa “ACTIVITY OVER”.
Si richiede di implementare in Java :
− una classe per la gestione del modulo Master (IP: 150.100.100.100 TCP port: 1111).
− una classe per la gestione delle macchine Slave (IP: 150.100.100.10x TCP port: 2222, con
x = 1….N ).
Vorrei sapere, per favore, se secondo voi potrebbe andare bene questa mia soluzione...
Classe Slave da installare su ogni singola macchina Slave:
import java.net.*;
import java.io.*;
import java.util.*;
public class Slave{
public static final int PORT=2222;
public static void main(String args[]){
try{
while(true){
ServerSocket serverSocket=new ServerSocket(PORT);
//attesa comando
Socket socket=serverSocket.accept();
//creazione stream in input
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//creazione stream in output
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
PrintWriter out=new PrintWriter(bw, true);
//controllo comando
if(in.readLine().equals("START ACTIVITY")){
Thread.sleep(15000); //simulo lo svolgimento dell'attività
out.println("ACTIVITY OVER");
}else{
out.println("COMMAND ERROR");
}
//chiudo le risorse
in.close();
out.close();
serverSocket.close();
socket.close();
}//while
}catch(Exception e){ System.out.println(e); }
}//run
}
Classe Master da installare sulla macchina master
import java.net.*;
import java.util.*;
import java.io.*;
public class Master{
public static void main(String args[]){
int nSlave=9;
boolean slaveLiberi[]=new boolean[nSlave];
//inizialmente tutti liberi
for(int i=0; i<nSlave; i++){
slaveLiberi[i]=true;
}
try{
while(true){
//creo il datagram socket sulla porta 1111
DatagramSocket ds=new DatagramSocket(1111);
byte buf[]=new byte[256];
DatagramPacket packet=new DatagramPacket(buf, buf.length);
//mi metto in attesa di una richiesta
ds.receive(packet);
//arrivata la richiesta controllo se ci sono slave liberi
int x=-1;
for(int i=0; i<nSlave; i++){
if(slaveLiberi[i]==true){
x=i;
slaveLiberi[i]=false;
break;
}
}
//se non ce ne sono
if(x==-1){
String s="SYSTEM BUSY";
buf=s.getBytes();
//prendo indirizzo e porta del richiedente e gli invio SYSTEM BUSY
InetAddress address=packet.getAddress();
int portClient=packet.getPort();
DatagramPacket packet2=new DatagramPacket(buf, buf.length, address, portClient);
ds.send(packet2);
}else{ //se c'è uno slave libero creo la connessione verso di lui
String ipSlave="150.100.100.10"+x;
InetAddress addressSlave=InetAddress.getByName(ipSlave);
Socket socket=new Socket(addressSlave, 2222);
String s="START ACTIVITY";
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
PrintWriter out=new PrintWriter(bw, true);
out.println(s); //gli invio il comando di partire
//attendo risposta
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
}
}//while
}catch(Exception e){
System.out.println(e);
}
}
}
Il compilatore non da errori, però non posso provarlo runtime... per questo chiedo a voi :) ...grazie
Si vuole realizzare un’applicazione Director capace di gestire una serie di attività eseguibili parallelamente.
Il sistema è composto da un coordinatore centrale, chiamato Master, e da un numero N di macchine,
chiamate Slave, che eseguono tutte lo stesso tipo di attività. Ogni Slave può eseguire una sola attività. Il
Master attende la richiesta di un client e, una volta ricevuta, individua se possibile uno Slave libero e lo
contatta per dare inizio all’attività. Se tutte le macchine Slave sono occupate il Master risponde
immediatamente al client inviando la stringa “SYSTEM BUSY”.
Per avviare l’attività di una macchina Slave, il Master deve semplicemente inviargli la stringa “START
ACTIVITY”. Il Master attende la fine dell’attività della macchina Slave e poi avvisa il client inviando la
stringa “ACTIVITY OVER”.
Si richiede di implementare in Java :
− una classe per la gestione del modulo Master (IP: 150.100.100.100 TCP port: 1111).
− una classe per la gestione delle macchine Slave (IP: 150.100.100.10x TCP port: 2222, con
x = 1….N ).
Vorrei sapere, per favore, se secondo voi potrebbe andare bene questa mia soluzione...
Classe Slave da installare su ogni singola macchina Slave:
import java.net.*;
import java.io.*;
import java.util.*;
public class Slave{
public static final int PORT=2222;
public static void main(String args[]){
try{
while(true){
ServerSocket serverSocket=new ServerSocket(PORT);
//attesa comando
Socket socket=serverSocket.accept();
//creazione stream in input
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//creazione stream in output
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
PrintWriter out=new PrintWriter(bw, true);
//controllo comando
if(in.readLine().equals("START ACTIVITY")){
Thread.sleep(15000); //simulo lo svolgimento dell'attività
out.println("ACTIVITY OVER");
}else{
out.println("COMMAND ERROR");
}
//chiudo le risorse
in.close();
out.close();
serverSocket.close();
socket.close();
}//while
}catch(Exception e){ System.out.println(e); }
}//run
}
Classe Master da installare sulla macchina master
import java.net.*;
import java.util.*;
import java.io.*;
public class Master{
public static void main(String args[]){
int nSlave=9;
boolean slaveLiberi[]=new boolean[nSlave];
//inizialmente tutti liberi
for(int i=0; i<nSlave; i++){
slaveLiberi[i]=true;
}
try{
while(true){
//creo il datagram socket sulla porta 1111
DatagramSocket ds=new DatagramSocket(1111);
byte buf[]=new byte[256];
DatagramPacket packet=new DatagramPacket(buf, buf.length);
//mi metto in attesa di una richiesta
ds.receive(packet);
//arrivata la richiesta controllo se ci sono slave liberi
int x=-1;
for(int i=0; i<nSlave; i++){
if(slaveLiberi[i]==true){
x=i;
slaveLiberi[i]=false;
break;
}
}
//se non ce ne sono
if(x==-1){
String s="SYSTEM BUSY";
buf=s.getBytes();
//prendo indirizzo e porta del richiedente e gli invio SYSTEM BUSY
InetAddress address=packet.getAddress();
int portClient=packet.getPort();
DatagramPacket packet2=new DatagramPacket(buf, buf.length, address, portClient);
ds.send(packet2);
}else{ //se c'è uno slave libero creo la connessione verso di lui
String ipSlave="150.100.100.10"+x;
InetAddress addressSlave=InetAddress.getByName(ipSlave);
Socket socket=new Socket(addressSlave, 2222);
String s="START ACTIVITY";
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
PrintWriter out=new PrintWriter(bw, true);
out.println(s); //gli invio il comando di partire
//attendo risposta
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
}
}//while
}catch(Exception e){
System.out.println(e);
}
}
}
Il compilatore non da errori, però non posso provarlo runtime... per questo chiedo a voi :) ...grazie