Advertisement
Guest User

Untitled

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