// thread "sono vivo" per il controllo del master da parte degli slaves
// e per la registrazione di nuovi slaves (a master avviato).
import java.net.*;
import java.io.IOException;
public class AliveThread extends Thread {
private DatagramSocket s;
private DatagramPacket indata,outdata;
private byte inbuf[],outbuf[];
public AliveThread(int p) {
try { s=new DatagramSocket(p);
} catch(SocketException ex) {
System.out.println("Master$AliveThread: "+ex.toString());
System.exit(p);
}
catch(SecurityException ex) {
System.out.println("Master$AliveThread: "+ex.toString());
System.exit(p);
}
}
/* attesa di pacchetti dagli slaves:
quando riceve un pacchetto vuoto spedisce al mittente la lista degli
slaves morti (la lista e' costituita da slave_ip:porta separati
da \n). Se il pacchetto contiene il msg "aggiungi slave" aggiunge
lo slave mittente e gli manda la lista degli slaves vivi seguita
da quella degli slaves morti (le liste sono separate da "***\n").
*/
public void run() {
while (true)
try { // i pacchetti ricevuti possono essere vuoti o possono conte-
// nere il msg "aggiungi slave".
inbuf=new byte[14];
indata=new DatagramPacket(inbuf,inbuf.length);
s.receive(indata);
String msg=(new String(indata.getData())).trim();
String risp;
if (msg.equals("aggiungi slave"))
{ // aggiunge il mittente alla lista degli slaves vivi
String ip=(indata.getAddress()).getHostAddress();
int porta=indata.getPort();
ConstantsM.sv.putSlave(ip,porta);
risp=ConstantsM.sv.aliveToString()+"***\n"+ConstantsM.sv.deadToString();
System.out.println("Master$AliveThread: aggiunto slave "+ip+":"+porta);
}
else risp=ConstantsM.sv.deadToString();
outbuf=risp.getBytes();
outdata=new DatagramPacket(outbuf,outbuf.length,indata.getAddress(),indata.getPort());
s.send(outdata);
} catch(IOException ex) {
System.out.println("Master$AliveThread.run: "+ex.toString());
}
}
} // fine AliveThread