Advertisement
Guest User

Untitled

a guest
Feb 15th, 2020
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.35 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import java.util.concurrent.ExecutorService;
  10. import java.util.concurrent.Executors;
  11. import java.util.function.BiConsumer;
  12.  
  13. public class Server {
  14.  
  15.     // port of server
  16.     private final int PORT;
  17.  
  18.     // Thread pool
  19.     ExecutorService threadPool;
  20.     // Max Thread pool count
  21.     private final int THREAD_COUNT = 10;
  22.  
  23.     //server
  24.     private ServerSocket server;
  25.  
  26.     // backing container
  27.     private Map<String, String> db;
  28.  
  29.     // boolean that tells server to stop
  30.     private volatile boolean stop = false;
  31.  
  32.     public Server(int port){
  33.         this.PORT = port;
  34.  
  35.         db = new HashMap<>();
  36.  
  37.         try {
  38.             server = new ServerSocket(PORT);
  39.         } catch (IOException e) {
  40.             e.printStackTrace();
  41.         }
  42.  
  43.         threadPool = Executors.newFixedThreadPool(THREAD_COUNT);
  44.     }
  45.  
  46.     public void listen(){
  47.         try {
  48.             while(!stop){
  49.                 threadPool.execute(onSocket(server.accept(), onInput));
  50.             }
  51.         } catch (IOException e) {
  52.             e.printStackTrace();
  53.         }
  54.     }
  55.  
  56.     public void stop(){
  57.         threadPool.shutdown();
  58.         stop = true;
  59.     }
  60.  
  61.     private BiConsumer<String, PrintWriter> onInput = (input, output) -> {
  62.         // incoming msg
  63.         String[] inMessage = input.split(":");
  64.         String identifier = inMessage[0];
  65.  
  66.         String[] keyValuePair = inMessage[1].split("-");
  67.  
  68.         String key = keyValuePair.length > 0 ? keyValuePair[0] : "";
  69.         String value = keyValuePair.length > 1 ? keyValuePair[1] : "";
  70.  
  71.         // out going msg
  72.         String outMessage;
  73.  
  74.         switch (identifier){
  75.             case "Add":
  76.                 db.put(key, value);
  77.                 outMessage = "Success: Added value";
  78.                 break;
  79.             case "AddList":
  80.                 String dbValue = db.getOrDefault(key, "");
  81.                 value = dbValue.equals("") ? value : String.format("%s,%s", dbValue, value);
  82.                 db.put(key, value);
  83.                 outMessage = "Success: Added value";
  84.                 break;
  85.             case "Get":
  86.                 outMessage = db.getOrDefault(key, "null");
  87.                 break;
  88.             case "GetList":
  89.                 outMessage = db.getOrDefault(key, "null");
  90.                 break;
  91.             case "shutdown":
  92.                 stop();
  93.                 outMessage = "Shutting down Server";
  94.                 break;
  95.             default:
  96.                 outMessage = "Error: Unknown Command";
  97.         }
  98.         output.println(outMessage);
  99.     };
  100.  
  101.     private Runnable onSocket(final Socket client, BiConsumer<String, PrintWriter> onInput){
  102.         return () -> {
  103.             try{
  104.                 PrintWriter output = new PrintWriter(client.getOutputStream(), true);
  105.                 BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));
  106.  
  107.                 onInput.accept(input.readLine(), output);
  108.  
  109.                 output.close();
  110.                 input.close();
  111.                 client.close();
  112.             } catch (IOException e){
  113.                 e.printStackTrace();
  114.             }
  115.         };
  116.     }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement