Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.58 KB | None | 0 0
  1.  
  2. import java.io.IOException;
  3. import java.io.ObjectInputStream;
  4. import java.io.ObjectOutputStream;
  5. import java.net.InetSocketAddress;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.util.ArrayList;
  9. import java.util.logging.Level;
  10. import java.util.logging.Logger;
  11. import java.net.DatagramSocket;
  12. import java.net.InetAddress;
  13. import java.util.Collections;
  14. import java.util.Comparator;
  15.  
  16. public class Server implements Runnable {
  17.  
  18.     public static String leader = "";
  19.     public static boolean isLeader = false;
  20.     public static ServerSocket serverSocket = null; // Sempre que for o leader vai ter valor definido
  21.     public static ArrayList<String> IP_LIST = new ArrayList<>();
  22.     public static int PORT = 4000;
  23.     public static boolean IN_SELECTION = false;
  24.     public static int tries = 3;
  25.  
  26.     public Server() {
  27.         System.out.println("Initializing....");
  28.         Thread t = new Thread(this);
  29.         t.start();
  30.     }
  31.  
  32.     @Override
  33.     public void run() {
  34.         Server.IP_LIST.add("10.3.15.17");
  35.         //Server.IP_LIST.add("10.3.15.18");
  36.         Server.IP_LIST.add("10.3.15.19");
  37.  
  38.         String candidateLeader = "";
  39.         while (true) {
  40.             try {
  41.                 if (Server.isLeader()) {
  42.                     System.out.println("----------------------------------");
  43.  
  44.                     if (!amIRealyTheLeader()) {
  45.                         candidateLeader = Server.electLeader();
  46.  
  47.                         if (candidateLeader.isEmpty()) {
  48.                             System.out.println("Assuming leadership...");
  49.                             Server.takeLeadership();
  50.                         } else {
  51.                             System.out.println("Defining candidate leader...");
  52.                             Server.defineLider(candidateLeader);
  53.                         }
  54.                     }
  55.  
  56.                     try (final DatagramSocket socket = new DatagramSocket()) {
  57.                         socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
  58.                         String ip = socket.getLocalAddress().getHostAddress();
  59.  
  60.                         System.out.println("I am the leader - " + ip);
  61.                     }
  62.  
  63.                     Thread.sleep(5 * 1000);
  64.  
  65.                 } else if (!Server.ping(Server.leader).isEmpty()) {
  66.                     System.out.println("----------------------------------");
  67.                     System.out.println("I am not the leader, but ping to leader responded");
  68.                     System.out.println("The leader is: " + Server.leader);
  69.  
  70.                     System.out.println("Wait 10 seconds");
  71.                     Thread.sleep(10 * 1000);
  72.                 } else {
  73.                     System.out.println("----------------------------------");
  74.                     System.out.println("There is no leader. Initializing election.");
  75.  
  76.                     if (!Server.IN_SELECTION) {
  77.                         candidateLeader = Server.electLeader();
  78.  
  79.                         if (candidateLeader.isEmpty()) {
  80.                             System.out.println("Assuming leadership...");
  81.                             Server.takeLeadership();
  82.                         } else {
  83.                             System.out.println("Defining candidate leader...");
  84.                             Server.defineLider(candidateLeader);
  85.                         }
  86.                     }
  87.                 }
  88.  
  89.                 printActiveIps();
  90.             } catch (Exception e) {
  91.                 try {
  92.                     Server.resetLeader();
  93.                 } catch (IOException ex) {
  94.                     Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
  95.                 }
  96.                 e.printStackTrace();
  97.             }
  98.         }
  99.     }
  100.  
  101.     public static boolean hasLeader() {
  102.         return Server.leader != null;
  103.     }
  104.  
  105.     public static boolean isLeader() {
  106.         return Server.isLeader;
  107.     }
  108.  
  109.     public static void resetLeader() throws IOException {
  110.         Server.isLeader = false;
  111.  
  112.         Server.leader = null;
  113.     }
  114.  
  115.     public static boolean amIRealyTheLeader() {
  116.         boolean answer = true;
  117.  
  118.         ArrayList<String> tempArray = Server.clone(Server.IP_LIST);
  119.  
  120.         Collections.sort(tempArray, new Comparator<String>() {
  121.             public int compare(String s1, String s2) {
  122.                 return s2.compareToIgnoreCase(s1);
  123.             }
  124.         });
  125.  
  126.         for (int i = 0; i < tempArray.size(); i++) {
  127.             String highestIp = tempArray.get(i);
  128.  
  129.             String response = ping(highestIp);
  130.  
  131.             if (response.isEmpty()) {
  132.                 continue;
  133.             }
  134.  
  135.             if (response.equals("I am the leader!")) {
  136.                 answer = false;
  137.                 break;
  138.             }
  139.         }
  140.  
  141.         return answer;
  142.     }
  143.  
  144.     public static String electLeader() throws IOException {
  145.         String leader = "";
  146.         Server.IN_SELECTION = true;
  147.         ArrayList<String> tempArray = Server.clone(Server.IP_LIST);
  148.  
  149.         Collections.sort(tempArray, new Comparator<String>() {
  150.             public int compare(String s1, String s2) {
  151.                 return s2.compareToIgnoreCase(s1);
  152.             }
  153.         });
  154.  
  155.         for (int j = 0; j < tries; j++) {
  156.             for (int i = 0; i < tempArray.size(); i++) {
  157.                 String highestIp = tempArray.get(i);
  158.                 System.out.println("Tryng pinging - " + highestIp);
  159.  
  160.                 String response = ping(highestIp);
  161.  
  162.                 if (response.isEmpty()) {
  163.                     System.out.println("Did not respond...");
  164.                     continue;
  165.                 }
  166.  
  167.                 if (response.equals("I am the leader!")) {
  168.                     leader = highestIp;
  169.                     break;
  170.                 }
  171.             }
  172.         }
  173.  
  174.         Server.IN_SELECTION = false;
  175.         return leader;
  176.     }
  177.  
  178.     public static ArrayList<String> clone(ArrayList<String> list) {
  179.         ArrayList<String> clone = new ArrayList<String>(list.size());
  180.         for (int i = 0; i < list.size(); i++) {
  181.             clone.add(list.get(i));
  182.         }
  183.         return clone;
  184.     }
  185.  
  186.     public static boolean defineLider(String s) throws IOException {
  187.         Server.resetLeader();
  188.         Server.leader = s;
  189.         return true;
  190.     }
  191.  
  192.     public static boolean takeLeadership() throws IOException {
  193.  
  194.         Server.isLeader = true;
  195.  
  196.         return true;
  197.     }
  198.  
  199.     public static String ping(String ip) {
  200.         String response = "";
  201.  
  202.         try {
  203.             Socket socket = new Socket();
  204.             socket.connect(new InetSocketAddress(ip, Server.PORT), 5 * 1000);
  205.  
  206.             ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
  207.             ObjectInputStream entrada = new ObjectInputStream(socket.getInputStream());
  208.  
  209.             saida.flush();
  210.             saida.writeObject("pinging...");
  211.  
  212.             response = (String) entrada.readObject();
  213.         } catch (Exception e) {
  214.             return response;
  215.         }
  216.  
  217.         return response;
  218.     }
  219.  
  220.     public static synchronized void printActiveIps() {
  221.         String ips = "";
  222.         for (String ip : IP_LIST) {
  223.             String response = ping(ip);
  224.  
  225.             if (!response.isEmpty()) {
  226.                 ips += ips.isEmpty() ? ip : "\n" + ip;
  227.             }
  228.         }
  229.  
  230.         System.out.println("----------------------------------");
  231.         System.out.println("Active ips:");
  232.         System.out.println(ips);
  233.     }
  234.  
  235.     public static void main(String[] args) {
  236.         new Server();
  237.         ThreadLeader l = new ThreadLeader();
  238.         l.run();
  239.     }
  240. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement