// 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