Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package src;
- 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;
- 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 Server()
- {
- System.out.println("Exec 1");
- 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("--------------------------------");
- 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.pingLeader())
- {
- 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.selectLeader();
- System.out.println("Leader returned - " + candidateLeader);
- if (candidateLeader.isEmpty())
- {
- System.out.println("Assuming leadership...");
- Server.takeLeadership();
- } else
- {
- System.out.println("Defining candidate leader...");
- Server.defineLider(candidateLeader);
- }
- }
- }
- } 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 String getHighestIp(ArrayList<String> vet)
- {
- String leaderIP = "";
- int comparator = 0;
- for (String string : vet)
- {
- String[] split = string.split("\\.");
- if (Integer.parseInt(split[3]) > comparator)
- {
- comparator = Integer.parseInt(split[3]);
- leaderIP = string;
- }
- }
- return leaderIP;
- }
- public static String selectLeader() throws IOException
- {
- String leader = "";
- Server.IN_SELECTION = true;
- ArrayList<String> vetInterno = Server.clone(Server.IP_LIST);
- for (int i = 0; i < vetInterno.size(); i++)
- {
- String highestIp = Server.getHighestIp(vetInterno);
- System.out.println("Tryng pinging - " + highestIp);
- try
- {
- Socket socket = new Socket();
- socket.connect(new InetSocketAddress(highestIp, Server.PORT), 10 * 1000);
- ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
- ObjectInputStream entrada = new ObjectInputStream(socket.getInputStream());
- saida.flush();
- saida.writeObject("pinging...");
- leader = highestIp;
- break;
- } catch (Exception e)
- {
- System.out.println("Did not respond...");
- vetInterno.remove(vetInterno.indexOf(highestIp));
- continue;
- }
- }
- 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 boolean pingLeader()
- {
- if (Server.leader.isEmpty())
- {
- return false;
- }
- boolean ping = false;
- System.out.println("Pinging leader...");
- try
- {
- Socket socket = new Socket();
- socket.connect(new InetSocketAddress(Server.leader, Server.PORT), 10 * 1000);
- ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
- ObjectInputStream entrada = new ObjectInputStream(socket.getInputStream());
- saida.flush();
- saida.writeObject("pinging...");
- ping = true;
- } catch (Exception e)
- {
- System.out.println("Leader did not respond...");
- }
- return ping;
- }
- public static void main(String[] args) throws IOException, ClassNotFoundException
- {
- new Server();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement