// // Robot.java: Agent primitif pour le TP1 de ift6802 // Jean Vaucher 14 janv. 2004 // // Represente un "aspirateur" qui cherche de la poussiere dans les // chambres d'un hotel // - Voir description du TP1 // http://www.iro.umontreal.ca/~vaucher/ift6802/TP1.txt import java.io.*; import java.net.*; import java.util.*; public class Robot3 { static Random rnd = new Random(); String sID ; int id = -1; int dir = 0; MulticastSocket multiSocket ; InetAddress multiAdr ; static int multiPort = 7777; DatagramSocket socket ; InetAddress localAdr ; int port ; Carte m ; // "M" pour MAP int boss = 0; int etat = 0; // -> 1 quand pos connue public static void main(String[] args) throws IOException { if (args.length>0) multiPort = Integer.parseInt( args[0] ); new Robot3().init(); } void init() throws IOException { multiAdr = InetAddress.getByName("230.0.0.1"); multiSocket = new MulticastSocket( multiPort ); multiSocket.joinGroup( multiAdr ); localAdr = InetAddress.getLocalHost(); socket = new DatagramSocket(); port = socket.getLocalPort(); socket.setSoTimeout(10000); // Attente maximum = 10 secondes // Enregistrement DatagramPacket packet; String data = "allo," + localAdr.getHostName() + "," + port ; packet = new DatagramPacket(data.getBytes(), data.length(), multiAdr, multiPort); System.out.println("Agent signing in"); socket.send(packet); new Slave1() . start(); System.out.println(" Agent waits for query"); while (true) // <<<<<<<<< Traitement des messages PRIVES <<<<< { try { byte[] buf = new byte[256]; packet = new DatagramPacket(buf, buf.length); try { socket.receive(packet); } catch (InterruptedIOException e) { System.out.println("*** Serveur ne repond pas, on termine. ***"); break; } catch (IOException e) {} data = new String(packet.getData(),0,packet.getLength()); //System.out.println("Recoit: " + data); StringTokenizer st = new StringTokenizer( data, "," ); String rep = st.nextToken(); // ---- traitement des collisions ------------ if( rep.equals("bang")) { m.handleBANG(); continue; } sID = st.nextToken(); String orig = st.nextToken(); String env = st.nextToken(); if (id < 0) // ======= Premier message nous identifie =========== { id = Integer.parseInt( sID ) ; System.out.println("Agent enregistre: " + id); m = new Carte( 2*(id%4)); broadcast("bonjour,345," + id ); // boss = id; } // ---- Mise a jour de la carte m.addEnv( env ); // ---- Trouver prochaine direction dir = m.doMove(); if ( etat==0 && m.posConnu) { // Des qu'on sait ou on est, on collabore etat++; boss=id; broadcast("taille,345," + id + "," + m.dimX + "," + m.dimY ); } data = "go,0," + id + "," + dir; buf = data.getBytes(); DatagramPacket p2 = new DatagramPacket(buf, buf.length, packet.getAddress(), packet.getPort()); socket.send(p2); // System.out.println( " Agent"+ id + " repond " + data); } catch (IOException e) { System.out.println("Probleme: " + e ); } } System.exit(0); } void broadcast( String s) { try { socket.send( new DatagramPacket( s.getBytes(), s.length(), multiAdr, multiPort)); } catch (IOException e) { System.out.println("Problem: " + e ); } } /* ================================================================= */ /* ========= Thread pour traiter les messages PUBLICS ============= */ /* ========= DEST=345 -> messages pour notre equipe ============= */ /* ================================================================= */ class Slave1 extends Thread { long t, t1, t2; int DX=0, DY=0; int ndirt = 0; Set agents = new TreeSet(), agents1 = new TreeSet(); public void run() { DatagramPacket packet; t1 = t2 = System.currentTimeMillis(); while (true) // <<<<<<<<<<<<<<<< Boucle principale <<<<<<<<<<<<<<<<< { t = System.currentTimeMillis(); if ( boss==id && t > t1) { broadcast("ping,345," + id ); t1= t + 2000; System.out.println("Agents: " + agents); if (! agents.equals(agents1) || ndirt >10 ) { repartir(agents); ndirt = 0; } agents1= agents; agents = new TreeSet(); } if ( t > t2 && etat>0 && boss!= id ) { boss=id; System.out.println(" ----------- " + boss + " -> BOSS"); } try { byte[] buf = new byte[256]; packet = new DatagramPacket(buf, buf.length); multiSocket.receive(packet); String received = new String(packet.getData(),0,packet.getLength()); StringTokenizer st = new StringTokenizer( received, "," ); String rep = st.nextToken(); String dest = st.nextToken(); String orig = st.nextToken(); if (rep.equals("pos")) { if (etat>0 && st.nextToken().equals(".")) { int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); if (m!=null) m.addDirt(x,y); ndirt++; } } if ( ! dest.equals("345")) continue; t2 = t + 5000; int sender = Integer.parseInt( orig ); if ( sender < id ) boss = sender; if ( rep.equals("bonjour") && boss == id) { System.out.println(" ---- Multicast: " + received); broadcast("taille,345," + id + "," + m.dimX + "," + m.dimY ); } else if ( rep.equals("ping") && etat > 0) { broadcast("pong,345," + id ); } else if ( rep.equals("pong") ) { agents .add( orig ); } else if ( rep.equals("taille") ) { System.out.println(" ---- Multicast: " + received); DX = Integer.parseInt( st.nextToken()); DY = Integer.parseInt( st.nextToken()); if (m!=null) m.setSize(DX,DY); } else if ( rep.equals("allera") && st.hasMoreTokens()) { System.out.println(" ---- Multicast: " + received); String data = st.nextToken(); String ss [] = data.split("/") ; for (int i=0; i= dimX) { ry += dh; sign *= -1; baseX += dimX; } x = (int)( sign>0 ? pos-baseX : baseX+dimX-pos-1); y = (int) ry; res.add( x+":"+y); } return res; } } // --- end Hotel Agent ----