Advertisement
Guest User

Untitled

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