DatStorm

Untitled

May 8th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.86 KB | None | 0 0
  1. package sendBackAndForth;
  2.  
  3. import java.io.IOException;
  4. import java.net.DatagramPacket;
  5. import java.net.DatagramSocket;
  6. import java.net.SocketException;
  7. import java.nio.ByteBuffer;
  8. import java.nio.file.Files;
  9. import java.nio.file.Path;
  10. import java.nio.file.Paths;
  11. import java.nio.file.StandardOpenOption;
  12. import java.util.HashMap;
  13. import java.util.Map;
  14.  
  15. public class OpSysServerRecieveAndSend {
  16.     private int serverport = 5432;
  17.     private int bufsize = 512;
  18.     private final int timeout = 50000;
  19.     //    private HashMap<String, Integer> map;
  20.     private int blockNum;
  21.     private int INIT_VAL = 123456789;
  22.     private int R = INIT_VAL;
  23.     private long S = INIT_VAL;
  24.     private int i = INIT_VAL;
  25.     private int B = OpSysClientSendRecieve.B;
  26.     private HashMap<Integer, Packet> byteMap;
  27.     private boolean haveRecivedS = false;
  28.  
  29.  
  30.     static public void main(String args[]) {
  31.         new OpSysServerRecieveAndSend().run();
  32.     } // end of main
  33.  
  34.     private void run() {
  35.         try {
  36.             byteMap = new HashMap<>();
  37. //            map = new HashMap<>();
  38.             DatagramSocket s = null; // UDP uses DatagramSockets
  39.             s = new DatagramSocket(serverport);
  40.             s.setSoTimeout(timeout); // set timeout in milliseconds
  41.             // create DatagramPacket object for receiving data:
  42.             DatagramPacket msg = new DatagramPacket(new byte[bufsize], bufsize);
  43.  
  44.             while (notRecievedAllPackages()) { // read loop
  45.                 handleReceive(s, msg);
  46.                 handleReply(s, msg);
  47.                 printAllEntris();
  48.             } // while
  49.  
  50.             Path path = Paths.get("/home/datstorm/IdeaProjects/Opsys-BFTP/src/recieveFiles/recieve.txt"); // FIXME make to relative path
  51.             byte[] bytes = getByteArray();
  52.             Files.write(path, bytes, StandardOpenOption.APPEND);
  53.  
  54.         } catch (SocketException e) {
  55.             e.printStackTrace();
  56.         } catch (IOException e) {
  57.             e.printStackTrace();
  58.         }
  59.     }
  60.  
  61.     private void printAllEntris() {
  62.         for (int k = 0; k < recivedB.length; k++) {
  63.             System.out.println("REC: " + k + ", =" + recivedB[k]);
  64.         }
  65.     }
  66.  
  67.     private boolean[] recivedB;
  68.     private boolean init = true;
  69.  
  70.     private boolean notRecievedAllPackages() {
  71.         // Make sure we have S
  72.         if (!haveRecivedS) {
  73.             return true;
  74.         }
  75.  
  76.         // we check if we have recived all packages
  77.         for (boolean b : recivedB) {
  78.             // we are not done contine while
  79.             if (!b) {
  80.                 return true;
  81.             }
  82.         }
  83.         // we are done int while.
  84.         return false;
  85.     }
  86.  
  87.     private void handleReceive(DatagramSocket s, DatagramPacket msg) throws IOException {
  88.         //Recive
  89.         msg.setLength(bufsize); // max received packet size
  90.         s.receive(msg); // the actual receive operation
  91.  
  92.  
  93.         //Read header
  94.         ByteBuffer buffer = ByteBuffer.wrap(msg.getData());
  95.         R = buffer.getInt();
  96.         S = buffer.getLong();
  97.         i = buffer.getInt();
  98.         haveRecivedS = true;
  99.  
  100.         // first time = have to do setup of packages
  101.         if (init) {
  102.             int blocksOfSizeB = (int) (Math.ceil((double) S / B)); // FIXME Removed -1 HERE
  103.             recivedB = new boolean[blocksOfSizeB];
  104.             init = false;
  105.         }
  106.  
  107.  
  108.  
  109.         ByteBuffer data = buffer.slice();
  110.         byte b = data.get();
  111.  
  112.         if (!recivedB[i]) {
  113.             byteMap.put(i, new Packet(R, S, i, b));
  114.             recivedB[i] = true;
  115.         }
  116.  
  117.         System.out.println(String.format("Recived package R: %d, S: %d, i: %d and with %d bytes of data", R, S, i, data.capacity()));
  118.     }
  119.  
  120.     private void handleReply(DatagramSocket s, DatagramPacket msg) throws IOException {
  121.  
  122.         /***********************************
  123.          * ACK
  124.          **********************************/
  125.         String key = msg.getSocketAddress().toString();
  126.         ByteBuffer buf = ByteBuffer.allocate(8);
  127.         buf.putInt(R);
  128.         buf.putInt(byteMap.get(i).getI());
  129.  
  130.         //Reply
  131.         DatagramPacket reply = new DatagramPacket(buf.array(), buf.capacity(), msg.getSocketAddress());
  132.         s.send(reply);
  133.     }
  134.  
  135.  
  136.     public byte[] getByteArray() {
  137.         byte[] bytes = new byte[Math.toIntExact(S)];
  138.         for (Map.Entry<Integer, Packet> integerByteEntry : byteMap.entrySet()) {
  139.             bytes[integerByteEntry.getKey()] = integerByteEntry.getValue().getData();
  140.         }
  141.         return bytes;
  142.     }
  143. }
  144.  
  145.  
  146.  
  147. /* FRAKLIP
  148.  
  149.  
  150.         //Store connection
  151. //        String key = msg.getSocketAddress().toString();
  152. //        blockNum = 0;
  153. //        if (!map.containsKey(key)) {
  154. //            map.put(key, blockNum);
  155. //        } else {
  156. //            blockNum = map.get(key);
  157. //            blockNum++;
  158. //            map.replace(key, blockNum);
  159. //        }
  160.  
  161.  */
Advertisement
Add Comment
Please, Sign In to add comment