Advertisement
Guest User

COMMIT NO URBAN

a guest
Oct 20th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 19.42 KB | None | 0 0
  1. import javax.xml.crypto.Data;
  2. import java.awt.*;
  3. import java.io.Serializable;
  4. import java.net.*;
  5. import java.io.IOException;
  6. import java.sql.SQLOutput;
  7. import java.util.ArrayList;
  8. import java.util.Scanner;
  9. import java.io.*;
  10. import static java.lang.Thread.sleep;
  11.  
  12. class User implements Serializable {
  13.     private String username, password, user_type;
  14.  
  15.     public User(String username, String password, String user_type) {
  16.         this.username = username;
  17.         this.password = password;
  18.         this.user_type = user_type;
  19.     }
  20.  
  21.     public String getUsername() {
  22.         return username;
  23.     }
  24.  
  25.     public String getPassword() {
  26.         return password;
  27.     }
  28.  
  29.     public String getUser_type() { return user_type; }
  30.  
  31.     public void setUser_type(String user_type) {
  32.         this.user_type = user_type;
  33.     }
  34. }
  35.  
  36.  
  37. class Music implements Serializable {
  38.     private String artist, genre, album, name;
  39.     private int duration;
  40.  
  41.     public Music(String artist, String genre, String album, String name, int duration) {
  42.         this.artist = artist;
  43.         this.genre = genre;
  44.         this.album = album;
  45.         this.name = name;
  46.         this.duration = duration;
  47.     }
  48.  
  49.     public String getArtist() {
  50.         return artist;
  51.     }
  52.  
  53.     public String getGenre() {
  54.         return genre;
  55.     }
  56.  
  57.     public String getAlbum_title() {
  58.         return album;
  59.     }
  60.  
  61.     public String getName() {
  62.         return name;
  63.     }
  64.  
  65.     public int getDuration() {
  66.         return duration;
  67.     }
  68. }
  69.  
  70.  
  71. class Album implements Serializable {
  72.     private String album_name, description;
  73.     private int rating; //rating médio
  74.     ArrayList <Music> music_list = new ArrayList<>(); //TALVEZ PÔR PRIVATE
  75.     ArrayList <Review> review_list = new ArrayList<>(); //TALVEZ PÔR PRIVATE
  76.  
  77.     public Album(String album_name, String description, int rating, ArrayList<Music> music_list, ArrayList<Review> review_list) {
  78.         this.album_name = album_name;
  79.         this.description = description;
  80.         this.rating = rating;
  81.         this.music_list = music_list;
  82.         this.review_list = review_list;
  83.     }
  84.  
  85.     public String getAlbum_name() {
  86.         return album_name;
  87.     }
  88.  
  89.     public String getDescription() {
  90.         return description;
  91.     }
  92.  
  93.     public int getRating() {
  94.         return rating;
  95.     }
  96.  
  97.     public ArrayList<Music> getMusic_list() {
  98.         return music_list;
  99.     }
  100.  
  101.     public ArrayList<Review> getReview_list() {
  102.         return review_list;
  103.     }
  104.  
  105.     public void setDescription(String description) {
  106.         this.description = description;
  107.     }
  108.  
  109.     public void setRating(int rating) {
  110.         this.rating = rating;
  111.     }
  112. }
  113.  
  114. class Review implements Serializable { //AINDA TENHO QUE VER PRECISA DE SERIALIZABLE OU NÃO
  115.     private String text;
  116.     private int rating;
  117.  
  118.     public Review(String text, int rating) {
  119.         this.text = text;
  120.         this.rating = rating;
  121.     }
  122.  
  123.     public String getText() {
  124.         return text;
  125.     }
  126.  
  127.     public int getRating() {
  128.         return rating;
  129.     }
  130. }
  131.  
  132.  
  133. class DatabaseConnection {
  134.     //Estudar ficheiros de texto e de objetos -> DONE
  135.     //Rever projeto de POO -> DONE
  136.     //Ver como ir buscar a música a uma diretoria e colocar música nessa diretoria
  137.  
  138.     public DatabaseConnection() {
  139.     }
  140.  
  141.     boolean username_match (String username){
  142.  
  143.         ArrayList <User> users = new ArrayList<>();
  144.  
  145.         //Abrir para a leitura do ficheiro de objetos
  146.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  147.             users = (ArrayList) oin.readObject();
  148.         } catch (IOException e){
  149.             System.out.println(e.getMessage());
  150.         } catch (ClassNotFoundException e) {
  151.             e.printStackTrace();
  152.         }
  153.  
  154.         for (User u: users){
  155.             if (u.getUsername().equals(username)) {
  156.                 return true;
  157.             }
  158.         }
  159.  
  160.         return false;
  161.     }
  162.  
  163.     boolean password_match (String username, String password){
  164.         //Tenho que procurar por username e depois por password
  165.         //Porque se procuro apenas pela password, pode encontrar a password certa, mas ser de outro utilizador
  166.  
  167.         ArrayList <User> users = new ArrayList<>();
  168.  
  169.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  170.             users = (ArrayList) oin.readObject();
  171.         } catch (IOException e){
  172.             System.out.println(e.getMessage());
  173.         } catch (ClassNotFoundException e) {
  174.             e.printStackTrace();
  175.         }
  176.  
  177.         for (User u: users) {
  178.             if (u.getUsername().equals(username)) {
  179.                 if (u.getPassword().equals(password)) {
  180.                     return true;
  181.                 }
  182.             }
  183.  
  184.         }
  185.         return false;
  186.     }
  187.  
  188. }
  189.  
  190.  
  191. class MessageParsing {
  192.  
  193.     public String [] MessageParsing (String message){
  194.  
  195.         //Separar por ";" e saber o número de pares
  196.         String [] pares  = message.split(";");
  197.         String  [] campos = new String[pares.length] ;
  198.  
  199.         if (pares.length >= 3){
  200.             for (int i = 0; i < pares.length; i++){
  201.                 String [] aux = pares[i].split("\\|");
  202.                 campos[i] = aux[1];
  203.             }
  204.         }
  205.  
  206.         //É melhor imprimir num ciclo que vai ate ao total de elementos do array, caso contrario opde criar exception
  207.         //System.out.println ("Tipo da mensagem: " + campos[0] + " campo2: " + campos[1] + " campo3: " + campos[2]);
  208.  
  209.         return campos;
  210.     }
  211.  
  212. }
  213.  
  214.  
  215. class UDPMulticastProtocol implements Serializable {
  216.  
  217.     private String MULTICAST_ADDRESS = "224.3.2.1";
  218.     private int PORT = 4444; //Porto de envio
  219.     DatabaseConnection data = new DatabaseConnection();
  220.  
  221.     public UDPMulticastProtocol() {
  222.  
  223.     }
  224.  
  225.     void login (String username, String password, MulticastSocket socket, int server_id){
  226.         System.out.println("O cliente deseja fazer login");
  227.         System.out.println("Username inserido: " + username);
  228.         System.out.println("Password inserida: " + password);
  229.         //Temos que ir à base de dados checkar se o username existe e qual a password associada e se é igual à inserida ou não
  230.  
  231.  
  232.         if (data.username_match(username)){
  233.            if (data.password_match(username, password)){ //SUCESSO
  234.                //System.out.println("GREAT SUCCESS");
  235.                String rsp = "server_id|" + server_id + "; type|status;" + "; logged|on; " + "msg|Welcome to DropMusic";
  236.  
  237.                try{
  238.                    byte[] buffer = rsp.getBytes();
  239.                    InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  240.                    DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  241.                    socket.send(packet);
  242.  
  243.                } catch (IOException e) {
  244.                    e.printStackTrace();
  245.                }
  246.  
  247.            }
  248.             else { //PASSWORD ERRADA
  249.                //System.out.println("PASSWORD ERRADA");
  250.                String rsp = "server_id|" + server_id + "; type|status;" + "; logged|failed; " + "msg|Password incorreta";
  251.  
  252.                try{
  253.                    byte[] buffer = rsp.getBytes();
  254.                    InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  255.                    DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  256.                    socket.send(packet);
  257.  
  258.                } catch (IOException e) {
  259.                    e.printStackTrace();
  260.                }
  261.            }
  262.         }
  263.  
  264.         else{ //UTILIZADOR NAO EXISTE
  265.             //System.out.println("Utilizador nao existe");
  266.             String rsp = "server_id|" + server_id + "; type|status;" + "; logged|failed; " + "msg|Utilizador nao existe";
  267.  
  268.             try{
  269.                 byte[] buffer = rsp.getBytes();
  270.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  271.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  272.                 socket.send(packet);
  273.  
  274.             } catch (IOException e) {
  275.                 e.printStackTrace();
  276.             }
  277.         }
  278.  
  279.  
  280.     }
  281.  
  282.     void register (String username, String password, MulticastSocket socket, int server_id) throws IOException {
  283.  
  284.         ArrayList <User> users = new ArrayList<>(); //ArrayList que contém todos os utilizadores
  285.  
  286.         System.out.println("O cliente deseja registar-se");
  287.         System.out.println("Username inserido: " + username);
  288.         System.out.println("Password inserida: " + password);
  289.  
  290.         //Temos que ver se existe o username ou não
  291.         if (!data.username_match(username)) {
  292.  
  293.             //Abrir para escrita no ficheiro de objetos
  294.             if (users.isEmpty()){ //Se der mal, vou ver se o tamanho e zero
  295.                 User u = new User(username, password, "admin");
  296.                 users.add(u);
  297.             }
  298.             else{
  299.                 User u = new User(username, password, "normal");
  300.                 users.add(u);
  301.             }
  302.  
  303.             try {
  304.                 ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users_obj.txt"));
  305.                 oS.writeObject(users);
  306.                 oS.close();
  307.  
  308.             } catch (IOException e) {
  309.                 System.out.print("ERRO");
  310.                 System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  311.             }
  312.  
  313.             String rsp = "server_id|" + server_id + "; type|status;" + "; register|successful; " + "msg|Welcome to DropMusic";
  314.             try{
  315.  
  316.                 byte[] buffer = rsp.getBytes();
  317.  
  318.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  319.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  320.                 socket.send(packet);
  321.  
  322.             } catch (IOException e) {
  323.                 e.printStackTrace();
  324.             }
  325.         }
  326.  
  327.         else {
  328.             String rsp = "server_id|" + server_id + "; type|status;" + "; register|unsuccessful; " + "msg|Esse username ja existe";
  329.  
  330.             try{
  331.                     byte[] buffer = rsp.getBytes();
  332.  
  333.                     InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  334.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  335.                     socket.send(packet);
  336.  
  337.             } catch (IOException e) {
  338.                 e.printStackTrace();
  339.             }
  340.         }
  341.  
  342.     }
  343.  
  344.     void search_music (){
  345.         System.out.println("O cliente deseja procurar musica");
  346.  
  347.  
  348.     }
  349.  
  350.     void make_editor (String novo_editor, String username, String password){
  351.         System.out.println("O cliente deseja tornar o utilizador " + novo_editor + " editor");
  352.  
  353.         ArrayList <User> users = new ArrayList<>();
  354.  
  355.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  356.             users = (ArrayList) oin.readObject();
  357.         } catch (IOException e){
  358.             System.out.println(e.getMessage());
  359.         } catch (ClassNotFoundException e) {
  360.             e.printStackTrace();
  361.         }
  362.  
  363.         //Verificar se o utilizador que está a querer tornar o outro num editor é também um editor
  364.         if (data.username_match(username)) {
  365.             if (data.password_match(username, password)) { //SUCESSO
  366.                 for (User u : users) {
  367.                     if (u.getUser_type().equals("editor")) {
  368.                         System.out.println("Tem permissao para tornar o utilizador " + novo_editor + " editor");
  369.                         for (User us : users) {
  370.                             if (us.getUsername().equals(novo_editor)) {
  371.                                 us.setUser_type("editor");
  372.                             }
  373.                             else{
  374.                                 System.out.println("Utilizador nao existe");
  375.                             }
  376.                         }
  377.                     }
  378.                 }
  379.             }
  380.         }
  381.  
  382.  
  383.     }
  384.  
  385.     void manage_data (){
  386.         System.out.println("O cliente pretende gerir artistas, álbuns e músicas");
  387.     }
  388.  
  389.     void search_info (){
  390.         System.out.println("O cliente pretende consultar detalhes sobre álbum e sobre artista");
  391.     }
  392.  
  393.     void album_review (String album_title, String text, String rating){
  394.         System.out.println("O cliente pretende escrever uma crítica a um álbum");
  395.  
  396.         //PRIMEIRO AINDA VOU TER QUE VERIFICAR SE O CLIENTE É DO TIPO EDITOR OU NÃO
  397.  
  398.  
  399.         ArrayList <Album> album_list = new ArrayList<>();
  400.  
  401.         for (Album a: album_list){
  402.             if (a.getAlbum_name().equals(album_title)){
  403.                 a.setDescription(text);
  404.                 a.setRating(Integer.parseInt(rating));
  405.             }
  406.         }
  407.  
  408.         //DEPOIS VOU TER QUE ENVIAR A RESPOSTA A DIZER QUE A REVIEW FOI ESCRITA
  409.  
  410.  
  411.     }
  412.  
  413.     void download (){
  414.         System.out.println("O cliente quer fazer download de uma música");
  415.     }
  416.  
  417.     void upload (){
  418.         System.out.println("O cliente quer fazer upload de uma música");
  419.     }
  420.  
  421.     void share_music (){
  422.         System.out.println("O cliente pretende partilhar música com outros utilizadores");
  423.     }
  424.  
  425. }
  426.  
  427.  
  428. class AnswerRequests extends Thread {
  429.  
  430.     //private String MULTICAST_ADDRESS = "224.3.2.1";
  431.     //private int PORT = 4444; //Porto de envio
  432.     private String message;
  433.     private String ip;
  434.     private int porto;
  435.     private MulticastSocket socket;
  436.     private int server_id;
  437.  
  438.     MessageParsing parsing = new MessageParsing();
  439.  
  440.     public AnswerRequests(String message, String ip, int porto, MulticastSocket socket, int server_id) {
  441.         this.message = message;
  442.         this.ip = ip;
  443.         this.porto = porto;
  444.         this.socket = socket;
  445.         this.server_id = server_id;
  446.     }
  447.  
  448.     public void run(){
  449.  
  450.         UDPMulticastProtocol prot = new UDPMulticastProtocol(); //Ver se é aqui que devo chamar o construtor ou não
  451.         System.out.println("Mensagem do cliente (IP: " + ip + ";Porto: " + porto + ")" + ": " + message);
  452.  
  453.         //Enviar resposta para o cliente
  454.         //MulticastSocket socket = null;
  455.  
  456.         //Parsing da mensagem
  457.         String [] pares = parsing.MessageParsing(message);
  458.         String type = pares[1];
  459.  
  460.         // De acordo com o tipo de argumento no campo "type" vamos definir a operacao pretendida e vai ser invocado o respetivo método
  461.         //Trata do pedido para depois enviar a resposta para o cliente
  462.         switch (type) {
  463.             case "login":
  464.                 prot.login(pares[2], pares[3], socket, server_id);
  465.                 break;
  466.             case "search music":
  467.                 prot.search_music();
  468.                 break;
  469.             case "make editor": //RESOLVER O PROBLEMA: COMO É QUE HEI DE SABER QUEM É QUE ESTÁ A QUERER TORNAR ALGUÉM EDITOR, PARA SABER SE TAMBÉM É EDITOR
  470.                 prot.make_editor(pares[2], pares[3], pares[4]);
  471.                 break;
  472.             case "register":
  473.                 try {
  474.                     prot.register(pares[2], pares[3], socket, server_id);
  475.                 } catch (IOException e) {
  476.                     e.printStackTrace();
  477.                 }
  478.                 break;
  479.             case "edit info":
  480.                 prot.manage_data();
  481.                 break;
  482.             case "search info":
  483.                 prot.search_info();
  484.                 break;
  485.             case "review":
  486.                 prot.album_review(pares[2], pares[3], pares[4]);
  487.                 break;
  488.             case "share music": //DEPOIS
  489.                 prot.share_music();
  490.                 break;
  491.             case "download": //DEPOIS
  492.                 prot.download();
  493.                 break;
  494.             case "upload":  //DEPOIS
  495.                 prot.upload();
  496.                 break;
  497.         }
  498.  
  499.     }
  500.  
  501. }
  502.  
  503. public class MulticastServer extends Thread {
  504.  
  505.     private String MULTICAST_ADDRESS = "224.3.2.1";
  506.     private int PORT = 4321; //Porto de recepção
  507.     private int BUFFER_SIZE = 4096;
  508.     private static int SERVER_ID;
  509.  
  510.     MessageParsing parsemsg = new MessageParsing();
  511.  
  512.     public static void main(String[] args) {
  513.         SERVER_ID = Integer.parseInt(args[0]); //ID DO SERVIDOR
  514.         MulticastServer server = new MulticastServer();
  515.         server.start(); //Ao invocar o start da thread, estamos a chamar o metodo run()
  516.     }
  517.  
  518.     public MulticastServer() {
  519.         //super ("Server Multicast #" + (long) (Math.random() * 100));
  520.         super ("Server Multicast #" + SERVER_ID);
  521.     }
  522.  
  523.     public void run(){
  524.         MulticastSocket socket = null;
  525.  
  526.         System.out.println(this.getName() + " running..."); //Vai buscar o que está dentro do método do construtor
  527.  
  528.         try {
  529.             socket = new MulticastSocket(PORT); //cria socket e dá bind
  530.             InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  531.             socket.joinGroup(group); //dá join ao grupo multicast
  532.  
  533.  
  534.             while (true) {
  535.                 //Recepcao
  536.                 byte[] inBuffer = new byte[BUFFER_SIZE];
  537.                 DatagramPacket msgIn = new DatagramPacket(inBuffer, inBuffer.length);
  538.                 socket.receive(msgIn); //Recebe o datagrama UDP
  539.  
  540.                 String clientIP = msgIn.getAddress().getHostAddress(); //Endereço IP do cliente que enviou a mensagem
  541.                 int clientport = msgIn.getPort(); //Porto do cliente
  542.  
  543.                 String message = new String(msgIn.getData(), 0, msgIn.getLength());
  544.                 String [] fields = parsemsg.MessageParsing(message);
  545.  
  546.                 if (Integer.parseInt(fields[0]) == SERVER_ID){
  547.                     System.out.println("SO VOU RESPONDER EU -> SERVER " + SERVER_ID);
  548.  
  549.                     //Vai buscar a informação da mensagem e lança a thread para tratar do pedido
  550.                     AnswerRequests work = new AnswerRequests(message, clientIP , clientport, socket, SERVER_ID); //Também vou passar a socket por parâmetro
  551.                     work.start();
  552.                 }
  553.                 else{
  554.                     //Se for um registo, mudança de informação de álbuns ou cenas que têm que ser replicadas
  555.                     //Ou seja, tem que ir para as 3 bases de dados e vai ser este "else" que vai tratar disso
  556.                     System.out.println("VOU ESTAR QUIETO -> SERVER " + SERVER_ID);
  557.  
  558.                 }
  559.  
  560.             }
  561.  
  562.         } catch (IOException e) {
  563.             e.printStackTrace();
  564.         } finally {
  565.             socket.close(); //Fechar a socket
  566.         }
  567.     }
  568.  
  569. }
  570.  
  571. /*
  572. try{
  573.             socket = new MulticastSocket(); //Não é necessário dar bind porque está apenas a enviar
  574.             socket.setTimeToLive(1);
  575.  
  576.             Scanner keyboardScaner = new Scanner(System.in);
  577.             while (true){
  578.                 String keyboard = keyboardScaner.nextLine();
  579.                 byte[] buffer = keyboard.getBytes();
  580.  
  581.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  582.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  583.                 socket.send(packet);
  584.             }
  585.         } catch (IOException e) {
  586.             e.printStackTrace();
  587.         } finally {
  588.             socket.close();
  589.         }
  590.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement