Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.net.InetSocketAddress;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.ArrayList;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- import java.util.Collections;
- import java.util.Comparator;
- public class Server implements Runnable {
- public static String leader = "";
- public static boolean isLeader = false;
- public static ServerSocket serverSocket = null; // Sempre que for o leader vai ter valor definido
- public static ArrayList<String> IP_LIST = new ArrayList<>();
- public static int PORT = 4000;
- public static boolean IN_SELECTION = false;
- public static int tries = 3;
- public Server() {
- System.out.println("Initializing....");
- Thread t = new Thread(this);
- t.start();
- }
- @Override
- public void run() {
- Server.IP_LIST.add("10.3.15.17");
- //Server.IP_LIST.add("10.3.15.18");
- Server.IP_LIST.add("10.3.15.19");
- String candidateLeader = "";
- while (true) {
- try {
- if (Server.isLeader()) {
- System.out.println("----------------------------------");
- if (!amIRealyTheLeader()) {
- resetLeader();
- candidateLeader = Server.electLeader();
- if (candidateLeader.isEmpty()) {
- System.out.println("Assuming leadership...");
- Server.takeLeadership();
- } else {
- System.out.println("Defining candidate leader...");
- Server.defineLider(candidateLeader);
- }
- }
- try (final DatagramSocket socket = new DatagramSocket()) {
- socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
- String ip = socket.getLocalAddress().getHostAddress();
- System.out.println("I am the leader - " + ip);
- }
- Thread.sleep(5 * 1000);
- } else if (!Server.ping(Server.leader).isEmpty()) {
- System.out.println("----------------------------------");
- System.out.println("I am not the leader, but ping to leader responded");
- System.out.println("The leader is: " + Server.leader);
- System.out.println("Wait 10 seconds");
- Thread.sleep(10 * 1000);
- } else {
- System.out.println("----------------------------------");
- System.out.println("There is no leader. Initializing election.");
- if (!Server.IN_SELECTION) {
- candidateLeader = Server.electLeader();
- if (candidateLeader.isEmpty()) {
- System.out.println("Assuming leadership...");
- Server.takeLeadership();
- } else {
- System.out.println("Defining candidate leader...");
- Server.defineLider(candidateLeader);
- }
- }
- }
- printActiveIps();
- } catch (Exception e) {
- try {
- Server.resetLeader();
- } catch (IOException ex) {
- Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
- }
- e.printStackTrace();
- }
- }
- }
- public static boolean hasLeader() {
- return Server.leader != null;
- }
- public static boolean isLeader() {
- return Server.isLeader;
- }
- public static void resetLeader() throws IOException {
- Server.isLeader = false;
- Server.leader = null;
- }
- public static boolean amIRealyTheLeader() {
- boolean answer = true;
- ArrayList<String> tempArray = Server.clone(Server.IP_LIST);
- Collections.sort(tempArray, new Comparator<String>() {
- public int compare(String s1, String s2) {
- return s2.compareToIgnoreCase(s1);
- }
- });
- for (int i = 0; i < tempArray.size(); i++) {
- String highestIp = tempArray.get(i);
- String response = ping(highestIp);
- if (response.isEmpty()) {
- continue;
- }
- if (response.equals("I am the leader!")) {
- answer = false;
- break;
- }
- }
- return answer;
- }
- public static String electLeader() throws IOException {
- String leader = "";
- Server.IN_SELECTION = true;
- ArrayList<String> tempArray = Server.clone(Server.IP_LIST);
- Collections.sort(tempArray, new Comparator<String>() {
- public int compare(String s1, String s2) {
- return s2.compareToIgnoreCase(s1);
- }
- });
- for (int j = 0; j < tries; j++) {
- for (int i = 0; i < tempArray.size(); i++) {
- String highestIp = tempArray.get(i);
- //System.out.println("Tryng pinging - " + highestIp);
- String response = ping(highestIp);
- if (response.isEmpty()) {
- //System.out.println("Did not respond...");
- continue;
- }
- if (response.equals("I am the leader!")) {
- leader = highestIp;
- break;
- }
- }
- }
- Server.IN_SELECTION = false;
- return leader;
- }
- public static ArrayList<String> clone(ArrayList<String> list) {
- ArrayList<String> clone = new ArrayList<String>(list.size());
- for (int i = 0; i < list.size(); i++) {
- clone.add(list.get(i));
- }
- return clone;
- }
- public static boolean defineLider(String s) throws IOException {
- Server.resetLeader();
- Server.leader = s;
- return true;
- }
- public static boolean takeLeadership() throws IOException {
- Server.isLeader = true;
- return true;
- }
- public static String ping(String ip) {
- String response = "";
- try {
- Socket socket = new Socket();
- socket.connect(new InetSocketAddress(ip, Server.PORT), 5 * 1000);
- ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
- ObjectInputStream entrada = new ObjectInputStream(socket.getInputStream());
- saida.flush();
- saida.writeObject("pinging...");
- response = (String) entrada.readObject();
- } catch (Exception e) {
- return response;
- }
- return response;
- }
- public static synchronized void printActiveIps() {
- String ips = "";
- for (int j = 0; j < tries; j++) {
- for (String ip : IP_LIST) {
- String response = ping(ip);
- if (!response.isEmpty() && !response.contains(ip)) {
- ips += ips.isEmpty() ? ip : "\n" + ip;
- }
- }
- }
- System.out.println("----------------------------------");
- System.out.println("Active ips:");
- System.out.println(ips);
- }
- public static void main(String[] args) {
- new Server();
- ThreadLeader l = new ThreadLeader();
- l.run();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement