AngelovskiK

[ДС] Лабораториска 3(UDP) - Дистрибуирани задачи

Nov 22nd, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.27 KB | None | 0 0
  1. package lab3udp;
  2.  
  3. import java.io.*;
  4. import java.net.*;
  5. import java.util.LinkedList;
  6. import java.util.List;
  7. import java.util.Random;
  8.  
  9. enum Status {
  10.     Uspeh,
  11.     NepoznatOperator,
  12.     DelenjeSoNula,
  13.     NemaRabotnik
  14. }
  15.  
  16. class Zadaca implements Serializable {
  17.     double operand1;
  18.     double operand2;
  19.     char operator;
  20.  
  21.     public Zadaca(double operand1, double operand2, char operator) {
  22.         this.operand1 = operand1;
  23.         this.operand2 = operand2;
  24.         this.operator = operator;
  25.     }
  26. }
  27.  
  28. class Rezultat implements Serializable {
  29.     double rezz;
  30.     Status status;
  31.  
  32.     public Rezultat(double rezz, Status status) {
  33.         this.rezz = rezz;
  34.         this.status = status;
  35.     }
  36.  
  37.     @Override
  38.     public String toString() {
  39.         return "Rezultat{" +
  40.                 "rezz=" + rezz +
  41.                 ", status=" + status +
  42.                 '}';
  43.     }
  44. }
  45.  
  46. class ClientThread extends Thread {
  47.     DatagramPacket packet;
  48.  
  49.     public ClientThread(DatagramPacket packet) {
  50.         this.packet = packet;
  51.     }
  52.  
  53.     @Override
  54.     public void run() {
  55.         try {
  56.             byte[] bytes = packet.getData();
  57.             ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream(bytes));
  58.             Zadaca zadaca = (Zadaca) ois.readObject();
  59.  
  60.             ByteArrayOutputStream bos = new ByteArrayOutputStream();
  61.             ObjectOutputStream oos = new ObjectOutputStream(bos);
  62.             RabotnikThread rabotnik = Server.najdiRabotnik(zadaca);
  63.             if(rabotnik == null)
  64.                 oos.writeObject(new Rezultat(Double.NaN, Status.NemaRabotnik));
  65.             else
  66.                 oos.writeObject(rabotnik.zadadiRabota(zadaca));
  67.             oos.flush();
  68.             byte[] bytesOut = bos.toByteArray();
  69.  
  70.             DatagramPacket dp = new DatagramPacket(bytesOut, bytesOut.length);
  71.             dp.setPort(packet.getPort());
  72.             dp.setAddress(packet.getAddress());
  73.             Server.socket.send(dp);
  74.         } catch (Exception e) {
  75.             e.printStackTrace();
  76.         }
  77.     }
  78. }
  79.  
  80. class Server extends Thread{
  81.     static DatagramSocket socket;
  82.     static List<RabotnikThread> rabotnici;
  83.  
  84.     public Server() throws SocketException {
  85.         this.socket = new DatagramSocket(5445);
  86.         rabotnici = new LinkedList<>();
  87.     }
  88.  
  89.     public static RabotnikThread najdiRabotnik(Zadaca zadaca) {
  90.         for (RabotnikThread rabotnik: rabotnici) {
  91.             if(rabotnik.sloboden)
  92.                 return rabotnik;
  93.         }
  94.         return null;
  95.     }
  96.  
  97.     class RabotaSoKlienti extends Thread {
  98.         DatagramSocket socket;
  99.  
  100.         public RabotaSoKlienti(DatagramSocket socket) {
  101.             this.socket = socket;
  102.         }
  103.  
  104.         @Override
  105.         public void run() {
  106.             try {
  107.                 while (true) {
  108.                     byte[] buffer = new byte[250];
  109.                     DatagramPacket tmp = new DatagramPacket(buffer, 250);
  110.                     socket.receive(tmp);
  111.                     ClientThread ct = new ClientThread(tmp);
  112.                     ct.start();
  113.                 }
  114.             }catch (IOException e) {
  115.                 System.err.println(e.getLocalizedMessage());
  116.             }
  117.         }
  118.     }
  119.  
  120.     @Override
  121.     public void run() {
  122.         RabotaSoKlienti rabotaSoKlienti = null;
  123.         try {
  124.             rabotaSoKlienti = new RabotaSoKlienti(new DatagramSocket(5444));
  125.             rabotaSoKlienti.start();
  126.         } catch (SocketException e) {
  127.             e.printStackTrace();
  128.         }
  129.         try {
  130.             while (true) {
  131.                 byte[] buffer = new byte[250];
  132.                 DatagramPacket tmp = new DatagramPacket(buffer, 250);
  133.                 socket.receive(tmp);
  134.                 RabotnikThread rt = new RabotnikThread(tmp.getAddress(), tmp.getPort());
  135.                 rt.start();
  136.                 rabotnici.add(rt);
  137.             }
  138.         }catch (IOException e) {
  139.             System.err.println(e.getLocalizedMessage());
  140.         }
  141.     }
  142. }
  143.  
  144. class Client extends Thread {
  145.     String input;
  146.     DatagramSocket socket;
  147.  
  148.     public Client(String input) throws IOException {
  149.         this.input = input;
  150.         Random random = new Random();
  151.         socket = new DatagramSocket();
  152.     }
  153.  
  154.     @Override
  155.     public void run() {
  156.         try {
  157.             String line = input;
  158.             String[] lineSegments = line.split(" ");
  159.             double operand1 = Double.parseDouble(lineSegments[0]);
  160.             char operator = lineSegments[1].charAt(0);
  161.             double operand2 =  Double.parseDouble(lineSegments[2]);
  162.             Zadaca z = new Zadaca(operand1, operand2, operator);
  163.  
  164.             ByteArrayOutputStream bos = new ByteArrayOutputStream();
  165.             ObjectOutputStream oos = new ObjectOutputStream(bos);
  166.             oos.writeObject(z);
  167.             oos.flush();
  168.             byte[] bytes = bos.toByteArray();
  169.             DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length, InetAddress.getByName("localhost"), 5444);
  170.  
  171.             socket.send(datagramPacket);
  172.  
  173.             DatagramPacket received = new DatagramPacket(new byte[250], 250);
  174.             socket.receive(received);
  175.  
  176.             ByteArrayInputStream bis = new ByteArrayInputStream(received.getData());
  177.             ObjectInputStream ois = new ObjectInputStream(bis);
  178.             String s = new String(received.getData());
  179.             Rezultat rezultat = (Rezultat) ois.readObject();
  180.             System.out.println(rezultat);
  181.         } catch (IOException | ClassNotFoundException e) {
  182.             e.printStackTrace();
  183.         }
  184.     }
  185. }
  186.  
  187.  
  188. class RabotnikThread extends Thread {
  189.     DatagramSocket socket;
  190.     InetAddress rabotnikAddress;
  191.     int rabotnikPort;
  192.     public boolean sloboden;
  193.  
  194.     public RabotnikThread(InetAddress rabotnikAddress, int rabotnikPort) throws IOException {
  195.         this.socket = new DatagramSocket();
  196.         sloboden = true;
  197.         this.rabotnikAddress = rabotnikAddress;
  198.         this.rabotnikPort = rabotnikPort;
  199.     }
  200.  
  201.     @Override
  202.     public void run() {
  203.         while(true);
  204.     }
  205.  
  206.     public Rezultat zadadiRabota(Zadaca z) throws Exception {
  207.         if (!sloboden)
  208.             throw new Exception("Povikan zafaten rabotnik!");
  209.  
  210.         sloboden = false;
  211.         ByteArrayOutputStream bos = new ByteArrayOutputStream();
  212.         ObjectOutputStream oos = new ObjectOutputStream(bos);
  213.         oos.writeObject(z);
  214.         oos.flush();
  215.         byte[] bytesToSend = bos.toByteArray();
  216.         DatagramPacket packetOut = new DatagramPacket(bytesToSend, bytesToSend.length);
  217.         packetOut.setAddress(rabotnikAddress);
  218.         packetOut.setPort(rabotnikPort);
  219.         socket.send(packetOut);
  220.  
  221.         byte[] buffer = new byte[2000];
  222.         DatagramPacket packetIn = new DatagramPacket(buffer, 2000);
  223.         socket.receive(packetIn);
  224.         ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream(buffer));
  225.         Rezultat rezz = (Rezultat) ois.readObject();
  226.         sloboden = true;
  227.         return rezz;
  228.     }
  229. }
  230.  
  231.  
  232. class Rabotnik extends Thread {
  233.     DatagramSocket socket;
  234.     @Override
  235.     public void run() {
  236.         try {
  237.             socket = new DatagramSocket();
  238.  
  239.             // oznaci mu na serverot deka si zapocnat
  240.             DatagramPacket najava = new DatagramPacket(new byte[] { 1 }, 1);
  241.             try {
  242.                 najava.setAddress(InetAddress.getByName("localhost"));
  243.             } catch (UnknownHostException e) {
  244.                 e.printStackTrace();
  245.             }
  246.             najava.setPort(5445);
  247.             try {
  248.                 socket.send(najava);
  249.             } catch (IOException e) {
  250.                 e.printStackTrace();
  251.             }
  252.  
  253.             // celo vreme citaj zadaci i vrakjaj rezz DO SMRT
  254.             byte[] buffer = new byte[2000];
  255.             while(true){
  256.                 DatagramPacket packetIn = new DatagramPacket(buffer, 2000);
  257.                 socket.receive(packetIn);
  258.                 ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer));
  259.                 Zadaca z = (Zadaca) ois.readObject();
  260.  
  261.                 ByteArrayOutputStream bos = new ByteArrayOutputStream();
  262.                 ObjectOutputStream oos = new ObjectOutputStream(bos);
  263.                 Rezultat rezz;
  264.                 switch (z.operator) {
  265.                     case '+':
  266.                         rezz = new Rezultat(z.operand1 + z.operand2, Status.Uspeh);
  267.                         break;
  268.                     case '-':
  269.                         rezz = new Rezultat(z.operand1 - z.operand2, Status.Uspeh);
  270.                         break;
  271.                     case '*':
  272.                         rezz = new Rezultat(z.operand1 * z.operand2, Status.Uspeh);
  273.                         break;
  274.                     case '/':
  275.                         rezz = z.operand2 == 0 ? new Rezultat(Double.NaN, Status.DelenjeSoNula) : new Rezultat(z.operand1 / z.operand2, Status.Uspeh);
  276.                         break;
  277.                     default:
  278.                         rezz = new Rezultat(Double.NaN, Status.NepoznatOperator);
  279.                 }
  280.                 oos.writeObject(rezz);
  281.                 oos.flush();
  282.                 byte[] bytes = bos.toByteArray();
  283.  
  284.                 DatagramPacket packetOut = new DatagramPacket(bytes, bytes.length);
  285.                 packetOut.setPort(packetIn.getPort());
  286.                 packetOut.setAddress(packetIn.getAddress());
  287.                 socket.send(packetOut);
  288.             }
  289.         } catch (IOException | ClassNotFoundException e)
  290.         {
  291.             e.printStackTrace();
  292.         }
  293.     }
  294. }
  295.  
  296. public class Lab3UDP {
  297.     public static void main(String[] args) throws IOException, InterruptedException {
  298.         Server server = new Server();
  299.         server.start();
  300.  
  301.         Rabotnik rabotnik = new Rabotnik();
  302.         rabotnik.start();
  303.  
  304.         Client clientThread = new Client("5.324 * 23.4");
  305.         clientThread.start();
  306.         clientThread.join();
  307.  
  308.         Client clientThread2 = new Client("65 + 4");
  309.         clientThread2.start();
  310.         clientThread2.join();
  311.  
  312.         Client clientThread3 = new Client("65 % 4");
  313.         clientThread3.start();
  314.         clientThread3.join();
  315.  
  316.         Client clientThread4 = new Client("65 / 0");
  317.         clientThread4.start();
  318.         clientThread4.join();
  319.  
  320.         server.join();
  321.     }
  322. }
Add Comment
Please, Sign In to add comment