Advertisement
Guest User

Untitled

a guest
May 20th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.50 KB | None | 0 0
  1. package ru.ifmo.rain.dulaev.hello;
  2.  
  3. import info.kgeorgiy.java.advanced.hello.HelloClient;
  4.  
  5. import java.io.IOException;
  6. import java.net.*;
  7. import java.util.Arrays;
  8. import java.util.Objects;
  9. import java.util.concurrent.ExecutorService;
  10. import java.util.concurrent.Executors;
  11. import java.util.concurrent.TimeUnit;
  12. import java.util.stream.IntStream;
  13.  
  14. public class HelloUDPClient implements HelloClient {
  15.  
  16.     private static final String USAGE = "Usage: HelloUDPClient (name|ip) port prefix threads requests";
  17.  
  18.     private static final int TIMEOUT_SECONDS_PER_REQUEST = 5;
  19.     private static final int SOCKET_SO_TIMEOUT = 200;
  20.     private static final boolean VERBOSE = false;
  21.  
  22.     public static void main(String[] args) {
  23.         if (args == null || args.length != 5) {
  24.             System.out.println(USAGE);
  25.         } else {
  26.             if (Arrays.stream(args).anyMatch(Objects::isNull)) {
  27.                 System.out.println("Non-null arguments expected");
  28.                 return;
  29.             }
  30.             try {
  31.                 int port = Integer.parseInt(args[1]);
  32.                 int threads = Integer.parseInt(args[3]);
  33.                 int requests = Integer.parseInt(args[4]);
  34.                 new HelloUDPClient().run(args[0], port, args[2], threads, requests);
  35.             } catch (NumberFormatException e) {
  36.                 System.out.println("Arguments 'port', 'threads' and 'requests' are expected to be integers: " +
  37.                         e.getMessage());
  38.             }
  39.         }
  40.     }
  41.  
  42.     @Override
  43.     public void run(String host, int port, String prefix, int threads, int requests) {
  44.         try {
  45.             final SocketAddress address = new InetSocketAddress(InetAddress.getByName(host), port);
  46.             parallelProcessAll(address, prefix, threads, requests);
  47.         } catch (UnknownHostException e) {
  48.             System.err.println("Unable to reach specified host: " + e.getMessage());
  49.         } catch (InterruptedException e) {
  50.             System.err.println("Execution was interrupted: " + e.getMessage());
  51.         }
  52.     }
  53.  
  54.     private void parallelProcessAll(final SocketAddress address, String prefix, int threads, int requests)
  55.             throws InterruptedException {
  56.         ExecutorService workers = Executors.newFixedThreadPool(threads);
  57.         IntStream.range(0, threads).forEach(threadId -> workers.submit(
  58.                 () -> processTask(address, prefix, threadId, requests)));
  59.         workers.shutdown();
  60.         workers.awaitTermination(TIMEOUT_SECONDS_PER_REQUEST * requests * threads, TimeUnit.SECONDS);
  61.     }
  62.  
  63.     private void processTask(final SocketAddress address, String prefix, int threadId, int requests) {
  64.         try (DatagramSocket socket = new DatagramSocket()) {
  65.             socket.setSoTimeout(SOCKET_SO_TIMEOUT);
  66.             int receiveBufferSize = socket.getReceiveBufferSize();
  67.             final DatagramPacket request = PacketUtils.newEmptyPacket(address, receiveBufferSize);
  68.             for (int requestId = 0; requestId < requests; requestId++) {
  69.                 String requestMessage = PacketUtils.encodeMessage(prefix, threadId, requestId);
  70.                 log(String.format("Sending '%s'", requestMessage));
  71.  
  72.                 boolean received = false;
  73.                 while (!received && !socket.isClosed() && !Thread.interrupted()) {
  74.                     try {
  75.                         PacketUtils.fillMessage(request, requestMessage);
  76.                         socket.send(request);
  77.                         PacketUtils.resetAndResize(request, receiveBufferSize);
  78.                         socket.receive(request);
  79.                         String responseMessage = PacketUtils.decodeMessage(request);
  80.                         if (received = PacketUtils.checkValidResponse(requestMessage, responseMessage)) {
  81.                             log(String.format("Received '%s'", responseMessage));
  82.                         }
  83.                     } catch (IOException e) {
  84.                         System.err.println("Error occured while trying to send a request or process a response: "
  85.                                 + e.getMessage());
  86.                     }
  87.                 }
  88.             }
  89.         } catch (SocketException e) {
  90.             System.err.println("Unable to establish connection via socket: " + e.getMessage());
  91.         }
  92.     }
  93.  
  94.     private static void log(String message) {
  95.         if (VERBOSE) {
  96. //            new PrintStream(System.out, true, StandardCharsets.UTF_8).println(message);
  97.             System.out.println(message);
  98.         }
  99.     }
  100.  
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement