michael_hartman_cz

TCP robot Karel 1.9, klient + server [PSI]

Feb 19th, 2013
459
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.38 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) {
  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.         while (!msg.endsWith("\r\n")) {
  78.             try {
  79.                 msg += (char) in.read();
  80.  
  81.             } catch (IOException ex) {
  82.                 Logger.getLogger(ClientConn.class.getName()).log(Level.SEVERE, null, ex);
  83.                 return "";
  84.             }
  85.             if (msg.length() > 30) {
  86.                 msg = "";
  87.             }
  88.         }
  89.         return msg;
  90.     }
  91.  
  92.     String parseOrder(String msg) {
  93.         try {
  94.             if (msg.startsWith(name)
  95.                     && (msg.substring(name.length() + 1, msg.indexOf("\r\n")).length() < 10)) {
  96.                 return msg.substring(name.length() + 1, msg.indexOf("\r\n"));
  97.             } else {
  98.                 return "";
  99.             }
  100.         } catch (Exception e) {
  101.             return "";
  102.         }
  103.     }
  104.  
  105.     String makeDecision(String order) {
  106.         if ("VLEVO".equals(order)) {
  107.             if (o == 1) {
  108.                 o = 4;
  109.             } else {
  110.                 o--;
  111.             }
  112.             return "240 OK " + "(" + x + "," + y + ")\r\n";
  113.         }
  114.         if ("ZVEDNI".equals(order)) {
  115.             if (x == 0 && y == 0) {
  116.                 return "260 USPECH You merely adopted beer."
  117.                         + " I was born in it, molded by it. "
  118.                         + "I didn’t see alcoholfree drink until I was already a man.\r\n";
  119.             }
  120.             return "550 NELZE ZVEDNOUT ZNACKU\r\n";
  121.         }
  122.         if ("KROK".equals(order)) {
  123.             if (broken != 11) { //broken                
  124.                 return "572 ROBOT SE ROZPADL\r\n";
  125.             }
  126.             step++;
  127.             if (ran.nextInt(10) == 3 || step == 9) { //i am broking this time
  128.                 broken = ran.nextInt(9) + 1;
  129.                 step = 0;
  130.                 return "580 SELHANI PROCESORU " + broken + "\r\n";
  131.             }
  132.             //nothing broken this time
  133.             switch (o) {
  134.                 case 1: //UP
  135.                     y++;
  136.                     break;
  137.                 case 2://RIGHT
  138.                     x++;
  139.                     break;
  140.                 case 3://DOWN
  141.                     y--;
  142.                     break;
  143.                 case 4://LEFT
  144.                     x--;
  145.                     break;
  146.             }
  147.             if (Math.abs(x) > 18 || Math.abs(y) > 18) {
  148.                 return "530 HAVARIE\r\n";
  149.             }
  150.             return "240 OK " + "(" + x + "," + y + ")\r\n";
  151.         }
  152.         if (order.startsWith("OPRAVIT ") && order.length() == 9) {
  153.             if (order.substring(8, 9).equals(String.valueOf(broken))) { //repairing right proc
  154.                 broken = 11;
  155.                 return "240 OK " + "(" + x + "," + y + ")\r\n";
  156.             }
  157.             return "571 PROCESOR FUNGUJE\r\n";
  158.         }
  159.         return "500 NEZNAMY PRIKAZ\r\n";
  160.     }
  161.  
  162.     @Override
  163.     public void run() {
  164.         initCommunication();
  165.         String response = "";
  166.         do {
  167.             response = makeDecision(parseOrder(readMsg(in)));
  168.             out.print(response);
  169.             out.flush();
  170.         } while (client.isConnected()
  171.                 && (response.startsWith("210")
  172.                 || response.startsWith("500")
  173.                 || response.startsWith("580")
  174.                 || response.startsWith("240")));
  175.         //close session
  176.         out.close();
  177.         try {
  178.             client.close();
  179.             System.out.println("Succesfully closing session for client " + client.getInetAddress() + ":" + client.getPort());
  180.             return;
  181.         } catch (IOException ex) {
  182.             Logger.getLogger(ClientConn.class.getName()).log(Level.SEVERE, null, ex);
  183.             System.out.println("Unsuccesfully closing session for client " + client.getInetAddress() + ":" + client.getPort());
  184.         }
  185.         return;
  186.     }
  187. }
  188.  
  189. class Client {
  190.  
  191.     static String parseName(String msg) {
  192.         String osloveni = "Oslovuj mne ";
  193.         int nameStart = msg.indexOf(osloveni) + osloveni.length();
  194.         int nameEnd = msg.indexOf(".", nameStart);
  195.         return msg.substring(nameStart, nameEnd);
  196.     }
  197.  
  198.     public static void cli_main(int port, String servername) throws IOException {
  199.         Socket echoSocket = null;
  200.         PrintWriter out = null;
  201.         BufferedReader in = null;
  202.         //init connection
  203.         try {
  204.             echoSocket = new Socket(servername, port);
  205.             out = new PrintWriter(echoSocket.getOutputStream(), true);
  206.             in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
  207.         } catch (UnknownHostException e) {
  208.             System.err.println("Unknown host: " + servername);
  209.             System.exit(1);
  210.         } catch (IOException e) {
  211.             System.err.println("Couldn't get I/O for " + servername);
  212.             System.exit(1);
  213.         }
  214.         int code = 0, x = 0, y = 0, pX = 0, pY = 0;
  215.         String request = "", response = "", name = "";
  216.         while (echoSocket.isConnected() && !(code == 260 || code == 530 || code == 550 || code == 571 || code == 572)) {
  217.             response = "";
  218.             while (!response.endsWith("\r\n")) {
  219.                 response += (char) in.read();
  220.             }
  221.             //print response
  222.             System.out.print("Receiving: " + response);
  223.             try {
  224.                 code = Integer.parseInt(response.substring(0, 3));
  225.             } catch (Exception e) {
  226.                 System.err.println("Recieved message without code");
  227.                 System.exit(1);
  228.             }
  229.  
  230.  
  231.             if (code == 210) {//initial communication              
  232.                 System.out.println("Parsed name: " + (name = parseName(response)));
  233.                 request = name + " VLEVO\r\n";
  234.             }
  235.             if (code == 580) { //processor damaged
  236.                 request = name + " OPRAVIT "
  237.                         + response.substring(response.length() - 3, response.length() - 2) //proc number
  238.                         + "\r\n";
  239.             }
  240.             if (code == 240) { //OK, bot is ready
  241.                 //AI goes here                    
  242.                 x = Integer.parseInt(response.substring(response.indexOf("(") + 1, response.indexOf(",")));
  243.                 y = Integer.parseInt(response.substring(response.indexOf(",") + 1, response.indexOf(")")));
  244.                 if (Math.abs(y) < Math.abs(pY) || Math.abs(x) < Math.abs(pX)) { //i am closer than last time
  245.                     request = name + " KROK\r\n";
  246.                 } else {
  247.                     request = name + " VLEVO\r\n"; //last time i went wrong
  248.                 }
  249.                 if (x == 0 && y == 1) {
  250.                     request = name + " VLEVO\r\n";
  251.                 }
  252.                 if (x == 0 && y == 0) { //im done
  253.                     request = name + " ZVEDNI\r\n";
  254.                 }
  255.                 if (x == pX && y == pY) { //no move last time
  256.                     request = name + " KROK\r\n";
  257.                 }
  258.             }
  259.             if (code != 260) {
  260.                 pX = x;
  261.                 pY = y;
  262.                 out.print(request); //send request to server
  263.                 out.flush(); //flush after each message
  264.                 System.out.println("sending: " + request);
  265.             }
  266.         }
  267.         //end transmision
  268.         System.out.println("\nConnection closed by foreign host: " + echoSocket.getInetAddress() + "\n");
  269.         out.close();
  270.         in.close();
  271.         echoSocket.close();
  272.     }
  273. }
  274.  
  275. public class Robot {
  276.  
  277.     /**
  278.      * @param args the command line arguments
  279.      */
  280.     public static void main(String[] args) throws IOException {
  281.         switch (args.length) {
  282.             case 1:
  283.                 System.out.println("Starting server...\n");
  284.                 Server.svr_main(Integer.parseInt(args[0]));
  285.                 break;
  286.             case 2:
  287.                 System.out.println("Starting client...\n");
  288.                 Client.cli_main(Integer.parseInt(args[1]), args[0]);
  289.                 break;
  290.             default:
  291.                 System.err.println("Client: java robot.Robot <hostname> <port>");
  292.                 System.err.println("Server: java robot.Robot <port>");
  293.                 System.exit(1);
  294.                 break;
  295.         }
  296.  
  297.     }
  298. }
Advertisement
Add Comment
Please, Sign In to add comment