public static void main(String args[]) throws Exception { /** On demande le port de connexion à l'utilisateur du programme */ Scanner sc = new Scanner(System.in); System.out.println("Port d'écoute local : "); int m_port_listening = sc.nextInt(); /** Le tout premier peer entrera un port distant = à son port local. */ System.out.println("Port d'écoute de l'hôte distant : "); int m_remote_port = sc.nextInt(); /** On demande la taille des paquets qui seront envoyés */ System.out.println("Taille des paquets : "); int m_paquet_size = sc.nextInt(); /** * On lance le thread qui écrira les messages délivrés dans un fichier. Ce fichier servira à la * vérification autonome du total ordonnancement des messages délivrés. */ FileThread file_thread = new FileThread(m_port_listening); file_thread.start(); /** Création de l'Engine et du Peer */ NioEngine engine = new NioEngine(m_paquet_size); Peer peer = new Peer(engine, file_thread); /** On lance le thread qui fera tourner l'Engine */ MainThread main_thread = new MainThread(engine, m_port_listening, m_remote_port, peer); main_thread.start(); /** Il faut appuyer sur la touche entrée pour que le programme s'arrête. */ while (true) { sc.nextLine(); if (sc.hasNextLine()) { break; } } sc.close(); /** On dit à tout le monde de s'arrêter. */ engine.m_running = false; engine.pw.close(); /** * On demande au file_thread de continuer l'écriture jusqu'à ce qu'il n'y ait plus de messages * délivrés à écrire dans le fichier. */ file_thread.end(engine.m_has_accept, m_port_listening, m_remote_port); }
@Override public void run() { try { super.run(); // To change body of generated methods, choose Tools | Templates. /** On écoute des connexions */ engine.listen(port_listening, peer); /** On se connecte avec le peer de port d'écoute remote_port. */ InetAddress m_localhost = InetAddress.getByName("localhost"); if (port_listening != remote_port) { engine.connect(m_localhost, remote_port, peer); } engine.mainloop(); } catch (UnknownHostException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); System.exit(-1); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); System.exit(-1); } }
@Override public void deliver(Channel channel, byte[] bytes) { ByteBuffer buffer = ByteBuffer.allocate(bytes.length); buffer.put(bytes); buffer.flip(); int length = buffer.getInt(); byte messageID = buffer.get(); switch (messageID) { case 0: byte[] deliver_array = new byte[length - 9]; int sender_id = buffer.getInt(); int lamport_timestamp = buffer.getInt(); buffer.get(deliver_array, 0, deliver_array.length); /*for (int i = 0; i < deliver_array.length; i++) { System.out.print(deliver_array[i] + " "); }*/ System.out.println("\n" + "---------------------------------------------------"); break; case 3: sender_id = buffer.getInt(); lamport_timestamp = buffer.getInt(); /*Si on est à l'origine du BroadcastJoin, on envoie d'abord la liste des autres peers avant de nous même se bloquer*/ if (engine.getId() == sender_id) { engine.setTimestamp(engine.getTimestamp() + 1); Message m = new MemberListMessage(engine.getTimestamp(), engine.getId(), engine.getPeersList()); byte[] message_array = m.sendMessage(); for (Channel other_channel : engine.getChannelList()) { if (((NioChannel) other_channel).isNouveauvenu()) { other_channel.send(message_array, 0, message_array.length); ((NioChannel) other_channel).setNouveauvenu(false); } } } ((NioChannel) channel).setBlocked(true); break; } }