Advertisement
LukacikPavel

siete_posielanieSuborov

Mar 13th, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.54 KB | None | 0 0
  1. package cviko1A;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.net.DatagramPacket;
  6. import java.net.DatagramSocket;
  7. import java.net.InetAddress;
  8. import java.net.SocketException;
  9. import java.net.UnknownHostException;
  10. import java.util.concurrent.ExecutorService;
  11. import java.util.concurrent.Executors;
  12.  
  13. public class FileInfoSender {
  14.  
  15.     public static final String FILE_PATH = "C:\\Users\\pc12\\Downloads\\SYS_PRGM.ova";
  16.     public static final int INFO_PORT = 5500;
  17.     public static final int REQUEST_PORT = 5501;
  18.     public static final int DATA_PORT = 5502;
  19.     public static final String TARGET_HOST = "158.197.35.101"; // 158.197.35.255
  20.     public static final long SLEEP_TO_NEXT_SEND = 1000; // 1sec
  21.  
  22.     public static void main(String[] args) {
  23.         File file = new File(FILE_PATH);
  24.         long fileLength = file.length();
  25.         String fileName = file.getName();
  26.  
  27.         ExecutorService threadManager = Executors.newCachedThreadPool();
  28.         Interval commonInterval = Interval.empty(0, fileLength - 1);
  29.         threadManager.execute(new FileSender(file, commonInterval));
  30.         threadManager.execute(new RequestReceiver(commonInterval));
  31.  
  32.         try (DatagramSocket soket = new DatagramSocket()) {
  33.             String message = fileName + "\n" + fileLength;
  34.             byte[] messageBytes = message.getBytes();
  35.             DatagramPacket paket = new DatagramPacket(messageBytes, messageBytes.length,
  36.                     InetAddress.getByName(TARGET_HOST), INFO_PORT);
  37.             while (true) {
  38.                 soket.send(paket);
  39.                 Thread.currentThread().sleep(SLEEP_TO_NEXT_SEND);
  40.             }
  41.         } catch (SocketException e) {
  42.             // TODO Auto-generated catch block
  43.             e.printStackTrace();
  44.         } catch (UnknownHostException e) {
  45.             // TODO Auto-generated catch block
  46.             e.printStackTrace();
  47.         } catch (IOException e) {
  48.             // TODO Auto-generated catch block
  49.             e.printStackTrace();
  50.         } catch (InterruptedException e) {
  51.             // TODO Auto-generated catch block
  52.             e.printStackTrace();
  53.         }
  54.     }
  55.  
  56. }
  57. ========================================================
  58. package cviko1A;
  59.  
  60. import java.io.ByteArrayOutputStream;
  61. import java.io.IOException;
  62. import java.io.ObjectOutputStream;
  63. import java.net.DatagramPacket;
  64. import java.net.DatagramSocket;
  65. import java.net.InetAddress;
  66. import java.net.SocketException;
  67. import java.net.SocketTimeoutException;
  68. import java.util.List;
  69. import java.util.Scanner;
  70.  
  71. public class FileReceiver {
  72.  
  73.     public static final int MAX_PACKET_SIZE = 1200;
  74.  
  75.     private Interval recievedBytes;
  76.     private String fileName;
  77.     private long fileLength;
  78.     private InetAddress fileSenderIP;
  79.     private DatagramSocket socket;
  80.  
  81.     public FileReceiver(String fileName, long fileLength, InetAddress fileSenderIP) {
  82.         this.fileName = fileName;
  83.         this.fileLength = fileLength;
  84.         this.fileSenderIP = fileSenderIP;
  85.         recievedBytes = Interval.empty(0, fileLength - 1);
  86.         try {
  87.             socket = new DatagramSocket(FileInfoSender.DATA_PORT);
  88.         } catch (SocketException e) {
  89.             // TODO Auto-generated catch block
  90.             e.printStackTrace();
  91.         }
  92.     }
  93.  
  94.     public void sendMissingIntervaosRequest() {
  95.         try {
  96.             ByteArrayOutputStream baos = new ByteArrayOutputStream(MAX_PACKET_SIZE);
  97.             ObjectOutputStream oos = new ObjectOutputStream(baos);
  98.             int maxCount = (MAX_PACKET_SIZE - Integer.BYTES) / (2 * Long.BYTES);
  99.             List<Interval> emptySubintervals = recievedBytes.getEmptySubintervals(maxCount);
  100.             oos.writeInt(emptySubintervals.size());
  101.             for (Interval i : emptySubintervals) {
  102.                 oos.writeLong(i.getMin());
  103.                 oos.writeLong(i.getMax());
  104.             }
  105.             oos.flush();
  106.             oos.close();
  107.  
  108.             byte[] messageBytes = baos.toByteArray();
  109.             DatagramPacket paket = new DatagramPacket(messageBytes, messageBytes.length, fileSenderIP,
  110.                     FileInfoSender.REQUEST_PORT);
  111.             socket.send(paket);
  112.         } catch (IOException e) {
  113.             // TODO Auto-generated catch block
  114.             e.printStackTrace();
  115.         }
  116.     }
  117.  
  118.     public static void main(String[] args) {
  119.         try (DatagramSocket soket = new DatagramSocket(FileInfoSender.INFO_PORT)) {
  120.             while (true) { // zo srandy
  121.                 byte[] buffer = new byte[soket.getReceiveBufferSize()];
  122.                 DatagramPacket paket = new DatagramPacket(buffer, buffer.length);
  123.                 soket.setSoTimeout((int) (FileInfoSender.SLEEP_TO_NEXT_SEND * 3));
  124.                 try {
  125.                     soket.receive(paket);
  126.                 } catch (SocketTimeoutException e) {
  127.                     System.err.println("Server nie je v sieti");
  128.                     return;
  129.                 }
  130.                 byte[] data = paket.getData();
  131.                 String message = new String(data).trim();
  132.                 System.out.println(message);
  133.                 Scanner scanner = new Scanner(message);
  134.                 String filename = scanner.nextLine();
  135.                 long fileLength = scanner.nextLong();
  136.                 scanner.close();
  137.                 System.out.println("Doslo: subor = " + filename);
  138.                 System.out.println("dlzka suboru = " + fileLength);
  139.                 System.out.println();
  140.             }
  141.         } catch (SocketException e) {
  142.             // TODO Auto-generated catch block
  143.             e.printStackTrace();
  144.         } catch (IOException e) {
  145.             // TODO Auto-generated catch block
  146.             e.printStackTrace();
  147.         }
  148.     }
  149.  
  150. }
  151. =========================================================
  152. package cviko1A;
  153.  
  154. import java.io.ByteArrayOutputStream;
  155. import java.io.File;
  156. import java.io.FileNotFoundException;
  157. import java.io.IOException;
  158. import java.io.ObjectOutputStream;
  159. import java.io.RandomAccessFile;
  160. import java.net.DatagramPacket;
  161. import java.net.DatagramSocket;
  162. import java.net.InetAddress;
  163. import java.net.SocketException;
  164.  
  165. public class FileSender implements Runnable {
  166.  
  167.     private DatagramSocket socket;
  168.     private Interval partsToSend;
  169.     private File file;
  170.     private RandomAccessFile raf;
  171.  
  172.     public FileSender(File file, Interval partsToSend) {
  173.         this.file = file;
  174.         this.partsToSend = partsToSend;
  175.     }
  176.  
  177.     @Override
  178.     public void run() {
  179.         try (DatagramSocket socket = new DatagramSocket(FileInfoSender.REQUEST_PORT);
  180.                 RandomAccessFile raf = new RandomAccessFile(file, "r")) {
  181.             this.raf = raf;
  182.             this.socket = socket;
  183.             while (true) {
  184.                 Interval interval = partsToSend.getAndEraseNextFullSubintervalBlocked(FileReceiver.MAX_PACKET_SIZE);
  185.                 sendFilePart(interval.getMin(), (int) interval.getMax());
  186.             }
  187.         } catch (SocketException e) {
  188.             // TODO Auto-generated catch block
  189.             e.printStackTrace();
  190.         } catch (FileNotFoundException e1) {
  191.             // TODO Auto-generated catch block
  192.             e1.printStackTrace();
  193.         } catch (IOException e1) {
  194.             // TODO Auto-generated catch block
  195.             e1.printStackTrace();
  196.         } catch (InterruptedException e) {
  197.             // TODO Auto-generated catch block
  198.             e.printStackTrace();
  199.         }
  200.     }
  201.  
  202.     private void sendFilePart(long offset, int maxLength) throws IOException {
  203.         raf.seek(offset);
  204.         byte[] bytes = new byte[maxLength];
  205.         int length = raf.read(bytes);
  206.         int packetLength = Long.BYTES + Integer.BYTES + length;
  207.  
  208.         ByteArrayOutputStream baos = new ByteArrayOutputStream(packetLength);
  209.         ObjectOutputStream oos = new ObjectOutputStream(baos);
  210.         oos.writeLong(offset);
  211.         oos.writeInt(length);
  212.         oos.write(bytes, 0, length);
  213.         oos.flush();
  214.         oos.close();
  215.  
  216.         byte[] messageBytes = baos.toByteArray();
  217.         DatagramPacket paket = new DatagramPacket(messageBytes, messageBytes.length,
  218.                 InetAddress.getByName(FileInfoSender.TARGET_HOST), FileInfoSender.REQUEST_PORT);
  219.         socket.send(paket);
  220.     }
  221.  
  222. }
  223. =======================================================================================
  224. package cviko1A;
  225.  
  226. import java.io.ByteArrayInputStream;
  227. import java.io.IOException;
  228. import java.io.ObjectInputStream;
  229. import java.net.DatagramPacket;
  230. import java.net.DatagramSocket;
  231. import java.net.SocketException;
  232. import java.net.SocketTimeoutException;
  233. import java.util.Scanner;
  234.  
  235. public class RequestReceiver implements Runnable {
  236.  
  237.     private Interval partsToSend;
  238.  
  239.     public RequestReceiver(Interval partsToSend) {
  240.         this.partsToSend = partsToSend;
  241.     }
  242.  
  243.     @Override
  244.     public void run() {
  245.         try {
  246.             DatagramSocket socket = new DatagramSocket(FileInfoSender.REQUEST_PORT);
  247.  
  248.             while (true) { // zo srandy
  249.                 byte[] buffer = new byte[socket.getReceiveBufferSize()];
  250.                 DatagramPacket paket = new DatagramPacket(buffer, buffer.length);
  251.                 socket.setSoTimeout((int) (FileInfoSender.SLEEP_TO_NEXT_SEND * 3));
  252.                 socket.receive(paket);
  253.                 byte[] data = paket.getData();
  254.                 ByteArrayInputStream bais = new ByteArrayInputStream(data);
  255.                 ObjectInputStream ois = new ObjectInputStream(bais);
  256.                 int intervalsCount = ois.readInt();
  257.                 for (int i = 0; i < intervalsCount; i++) {
  258.                     long min = ois.readLong();
  259.                     long max = ois.readLong();
  260.                     partsToSend.addFullSubinterval(min, max);
  261.                 }
  262.             }
  263.         } catch (SocketException e) {
  264.             // TODO Auto-generated catch block
  265.             e.printStackTrace();
  266.         } catch (IOException e) {
  267.             // TODO Auto-generated catch block
  268.             e.printStackTrace();
  269.         }
  270.     }
  271.  
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement