Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.67 KB | None | 0 0
  1. package robot;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.BufferedReader;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.io.PrintWriter;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;
  10. import java.net.UnknownHostException;
  11. import java.util.Random;
  12. import java.util.logging.Level;
  13. import java.util.logging.Logger;
  14.  
  15. class Server {
  16.  
  17.     public static void svr_main(int port) throws IOException {
  18.  
  19.         ServerSocket server = null;
  20.         try {
  21.             server = new ServerSocket(port);
  22.         } catch (IOException e) {
  23.             System.err.println("Could not listen on port: " + port);
  24.             System.exit(1);
  25.         }
  26.         Socket client = null;
  27.         while (true) {
  28.             try {
  29.                 client = server.accept();
  30.             } catch (IOException e) {
  31.                 System.err.println("Accept failed.");
  32.                 System.exit(1);
  33.             }
  34.             System.out.println("Accepted client " + client.getInetAddress() + ":" + client.getPort());
  35.             Thread t = new Thread(new ClientConn(client));
  36.             t.start();
  37.         }
  38.     }
  39. }
  40.  
  41. class ClientConn implements Runnable {
  42.  
  43.     private Socket client;
  44.     private BufferedInputStream in = null;
  45.     private PrintWriter out = null;
  46.     private Random ran = new Random();
  47.     private int x = ran.nextInt(17), y = ran.nextInt(17);
  48.     private String name = "Hlupaku";
  49.     private int o = ran.nextInt(4) + 1, step = 0, broken = 11;
  50.  
  51.     ClientConn(Socket client) { //konstruktor
  52.         this.client = client;
  53.         try {
  54.             in = new BufferedInputStream(client.getInputStream());
  55.             out = new PrintWriter(client.getOutputStream(), true);
  56.         } catch (IOException e) {
  57.             System.err.println("Couldn't get I/O for " + client.getInetAddress());
  58.             return;
  59.         }
  60.     }
  61.  
  62.     void initCommunication() {
  63.         if (ran.nextInt(2) == 1) {
  64.             x *= -1;
  65.         }
  66.         if (ran.nextInt(2) == 1) {
  67.             y *= -1;
  68.         }
  69.         out.print("210 Ahoj, jsem robot ale moc toho neumim. Oslovuj mne "
  70.                 + name
  71.                 + ". Muzeme zacit?\r\n");
  72.         out.flush();
  73.     }
  74.  
  75.     String readMsg(BufferedInputStream in) {
  76.         String msg = "";
  77.         int i;
  78.         while (!msg.endsWith("\r\n")) {
  79.             try {
  80.                 i = in.read();
  81.                 if (i == -1) {
  82.                     return "end";
  83.                 }
  84.                 msg += (char) i;
  85.  
  86.             } catch (IOException e) {
  87.                 return "end";
  88.             }
  89.             if (msg.length() > 30) {
  90.                 msg = "";
  91.             }
  92.         }
  93.         return msg;
  94.     }
  95.  
  96.     String parseOrder(String msg) {
  97.         if (msg.equals("end")){
  98.             return "end";
  99.         }
  100.         try {
  101.             if (msg.startsWith(name)
  102.                     && (msg.substring(name.length() + 1, msg.indexOf("\r\n")).length() < 10)) {
  103.                 return msg.substring(name.length() + 1, msg.indexOf("\r\n"));
  104.             } else {
  105.                 return "";
  106.             }
  107.         } catch (Exception e) {
  108.             return "";
  109.         }
  110.     }
  111.  
  112.     String makeDecision(String order) {
  113.         if ("VLEVO".equals(order)) {
  114.             if (o == 1) {
  115.                 o = 4;
  116.             } else {
  117.                 o--;
  118.             }
  119.             return "240 OK " + "(" + x + "," + y + ")\r\n";
  120.         }
  121.         if ("ZVEDNI".equals(order)) {
  122.             if (x == 0 && y == 0) {
  123.                 return "260 USPECH You merely adopted beer."
  124.                         + " I was born in it, molded by it. "
  125.                         + "I didn’t see alcoholfree drink until I was already a man.\r\n";
  126.             }
  127.             return "550 NELZE ZVEDNOUT ZNACKU\r\n";
  128.         }
  129.         if ("KROK".equals(order)) {
  130.             if (broken != 11) { //broken                
  131.                 return "572 ROBOT SE ROZPADL\r\n";
  132.             }
  133.             step++;
  134.             if (ran.nextInt(10) == 3 || step == 9) { //i am broking this time
  135.                 broken = ran.nextInt(9) + 1;
  136.                 step = 0;
  137.                 return "580 SELHANI r\nPROCESORU " + broken + "\r\n";
  138.             }
  139.             //nothing broken this time
  140.             switch (o) {
  141.                 case 1: //UP
  142.                     y++;
  143.                     break;
  144.                 case 2://RIGHT
  145.                     x++;
  146.                     break;
  147.                 case 3://DOWN
  148.                     y--;
  149.                     break;
  150.                 case 4://LEFT
  151.                     x--;
  152.                     break;
  153.             }
  154.             if (Math.abs(x) > 18 || Math.abs(y) > 18) {
  155.                 return "530 HAVARIE\r\n";
  156.             }
  157.             return "240 OK " + "(" + x + "," + y + ")\r\n";
  158.         }
  159.         if (order.startsWith("OPRAVIT ") && order.length() == 9) {
  160.             if (order.substring(8, 9).equals(String.valueOf(broken))) { //repairing right proc
  161.                 broken = 11;
  162.                 return "240 OK " + "(" + x + "," + y + ")\r\n";
  163.             }
  164.             if ("0".equals(order.substring(8, 9))) {
  165.                 return "500 NEZNAMY PRIKAZ\r\n";
  166.             }
  167.             return "571 PROCESOR FUNGUJE\r\n";
  168.         }
  169.         if (order.equals("end")) {
  170.             return "end";
  171.         }
  172.         return "500 NEZNAMY PRIKAZ\r\n";
  173.     }
  174.  
  175.     @Override
  176.     public void run() {
  177.         initCommunication();
  178.         String response = "";
  179.         do {
  180.             response = makeDecision(parseOrder(readMsg(in)));
  181.             if (!response.equals("end")) {
  182.                 out.print(response);
  183.                 out.flush();
  184.             }
  185.         } while (client.isConnected()
  186.                 && (response.startsWith("210")
  187.                 || response.startsWith("500")
  188.                 || response.startsWith("580")
  189.                 || response.startsWith("240")));
  190.         //close session
  191.         out.close();
  192.         try {
  193.             client.close();
  194.             System.out.println("Succesfully closing session for client " + client.getInetAddress() + ":" + client.getPort());            
  195.         } catch (IOException ex) {            
  196.             System.out.println("Unsuccesfully closing session for client " + client.getInetAddress() + ":" + client.getPort());
  197.         }
  198.         return;
  199.     }
  200. }
  201.  
  202. class Client {
  203.  
  204.     static String parseName(String msg) {
  205.         String osloveni = "Oslovuj mne ";
  206.         int nameStart = msg.indexOf(osloveni) + osloveni.length();
  207.         int nameEnd = msg.indexOf(".", nameStart);
  208.         return msg.substring(nameStart, nameEnd);
  209.     }
  210.  
  211.     public static void cli_main(int port, String servername) throws IOException {
  212.         Socket echoSocket = null;
  213.         PrintWriter out = null;
  214.         BufferedReader in = null;
  215.         //init connection
  216.         try {
  217.             echoSocket = new Socket(servername, port);
  218.             out = new PrintWriter(echoSocket.getOutputStream(), true);
  219.             in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
  220.         } catch (UnknownHostException e) {
  221.             System.err.println("Unknown host: " + servername);
  222.             System.exit(1);
  223.         } catch (IOException e) {
  224.             System.err.println("Couldn't get I/O for " + servername);
  225.             System.exit(1);
  226.         }
  227.         int code = 0, x = 0, y = 0, pX = 0, pY = 0;
  228.         String request = "", response = "", name = "";
  229.         while (echoSocket.isConnected() && !(code == 260 || code == 530 || code == 550 || code == 571 || code == 572)) {
  230.             response = "";
  231.             while (!response.endsWith("\r\n")) {
  232.                 response += (char) in.read();
  233.             }
  234.             //print response
  235.             System.out.print("Receiving: " + response);
  236.             try {
  237.                 code = Integer.parseInt(response.substring(0, 3));
  238.             } catch (Exception e) {
  239.                 System.err.println("Recieved message without code");
  240.                 System.exit(1);
  241.             }
  242.  
  243.  
  244.             if (code == 210) {//initial communication              
  245.                 System.out.println("Parsed name: " + (name = parseName(response)));
  246.                 request = name + " VLEVO\r\n";
  247.             }
  248.             if (code == 580) { //processor damaged
  249.                 request = name + " OPRAVIT "
  250.                         + response.substring(response.length() - 3, response.length() - 2) //proc number
  251.                         + "\r\n";
  252.             }
  253.             if (code == 240) { //OK, bot is ready
  254.                 //AI goes here                    
  255.                 x = Integer.parseInt(response.substring(response.indexOf("(") + 1, response.indexOf(",")));
  256.                 y = Integer.parseInt(response.substring(response.indexOf(",") + 1, response.indexOf(")")));
  257.                 if (Math.abs(y) < Math.abs(pY) || Math.abs(x) < Math.abs(pX)) { //i am closer than last time
  258.                     request = name + " KROK\r\n";
  259.                 } else {
  260.                     request = name + " VLEVO\r\n"; //last time i went wrong
  261.                 }
  262.                 if (x == 0 && y == 1) {
  263.                     request = name + " VLEVO\r\n";
  264.                 }
  265.                 if (x == 0 && y == 0) { //im done
  266.                     request = name + " ZVEDNI\r\n";
  267.                 }
  268.                 if (x == pX && y == pY) { //no move last time
  269.                     request = name + " KROK\r\n";
  270.                 }
  271.             }
  272.             if (code != 260) {
  273.                 pX = x;
  274.                 pY = y;
  275.                 out.print(request); //send request to server
  276.                 out.flush(); //flush after each message
  277.                 System.out.println("sending: " + request);
  278.             }
  279.         }
  280.         //end transmision
  281.         System.out.println("\nConnection closed by foreign host: " + echoSocket.getInetAddress() + "\n");
  282.         out.close();
  283.         in.close();
  284.         echoSocket.close();
  285.     }
  286. }
  287.  
  288. public class Robot {
  289.  
  290.     /**
  291.      * @param args the command line arguments
  292.      */
  293.     public static void main(String[] args) throws IOException {
  294.         switch (args.length) {
  295.             case 1:
  296.                 System.out.println("Starting server...\n");
  297.                 Server.svr_main(Integer.parseInt(args[0]));
  298.                 break;
  299.             case 2:
  300.                 System.out.println("Starting client...\n");
  301.                 Client.cli_main(Integer.parseInt(args[1]), args[0]);
  302.                 break;
  303.             default:
  304.                 System.err.println("Client: java robot.Robot <hostname> <port>");
  305.                 System.err.println("Server: java robot.Robot <port>");
  306.                 System.exit(1);
  307.                 break;
  308.         }
  309.  
  310.     }
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement