Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package robot;
- import java.io.BufferedInputStream;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.net.UnknownHostException;
- import java.util.Random;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- class Server {
- public static void svr_main(int port) throws IOException {
- ServerSocket server = null;
- try {
- server = new ServerSocket(port);
- } catch (IOException e) {
- System.err.println("Could not listen on port: " + port);
- System.exit(1);
- }
- Socket client = null;
- while (true) {
- try {
- client = server.accept();
- } catch (IOException e) {
- System.err.println("Accept failed.");
- System.exit(1);
- }
- System.out.println("Accepted client " + client.getInetAddress() + ":" + client.getPort());
- Thread t = new Thread(new ClientConn(client));
- t.start();
- }
- }
- }
- class ClientConn implements Runnable {
- private Socket client;
- private BufferedInputStream in = null;
- private PrintWriter out = null;
- private Random ran = new Random();
- private int x = ran.nextInt(17), y = ran.nextInt(17);
- private String name = "Hlupaku";
- private int o = ran.nextInt(4) + 1, step = 0, broken = 11;
- ClientConn(Socket client) { //konstruktor
- this.client = client;
- try {
- in = new BufferedInputStream(client.getInputStream());
- out = new PrintWriter(client.getOutputStream(), true);
- } catch (IOException e) {
- System.err.println("Couldn't get I/O for " + client.getInetAddress());
- return;
- }
- }
- void initCommunication() {
- if (ran.nextInt(2) == 1) {
- x *= -1;
- }
- if (ran.nextInt(2) == 1) {
- y *= -1;
- }
- out.print("210 Ahoj, jsem robot ale moc toho neumim. Oslovuj mne "
- + name
- + ". Muzeme zacit?\r\n");
- out.flush();
- }
- String readMsg(BufferedInputStream in) {
- String msg = "";
- int i;
- while (!msg.endsWith("\r\n")) {
- try {
- i = in.read();
- if (i == -1) {
- return "end";
- }
- msg += (char) i;
- } catch (IOException e) {
- return "end";
- }
- if (msg.length() > 30) {
- msg = "";
- }
- }
- return msg;
- }
- String parseOrder(String msg) {
- if (msg.equals("end")){
- return "end";
- }
- try {
- if (msg.startsWith(name)
- && (msg.substring(name.length() + 1, msg.indexOf("\r\n")).length() < 10)) {
- return msg.substring(name.length() + 1, msg.indexOf("\r\n"));
- } else {
- return "";
- }
- } catch (Exception e) {
- return "";
- }
- }
- String makeDecision(String order) {
- if ("VLEVO".equals(order)) {
- if (o == 1) {
- o = 4;
- } else {
- o--;
- }
- return "240 OK " + "(" + x + "," + y + ")\r\n";
- }
- if ("ZVEDNI".equals(order)) {
- if (x == 0 && y == 0) {
- return "260 USPECH You merely adopted beer."
- + " I was born in it, molded by it. "
- + "I didn’t see alcoholfree drink until I was already a man.\r\n";
- }
- return "550 NELZE ZVEDNOUT ZNACKU\r\n";
- }
- if ("KROK".equals(order)) {
- if (broken != 11) { //broken
- return "572 ROBOT SE ROZPADL\r\n";
- }
- step++;
- if (ran.nextInt(10) == 3 || step == 9) { //i am broking this time
- broken = ran.nextInt(9) + 1;
- step = 0;
- return "580 SELHANI r\nPROCESORU " + broken + "\r\n";
- }
- //nothing broken this time
- switch (o) {
- case 1: //UP
- y++;
- break;
- case 2://RIGHT
- x++;
- break;
- case 3://DOWN
- y--;
- break;
- case 4://LEFT
- x--;
- break;
- }
- if (Math.abs(x) > 18 || Math.abs(y) > 18) {
- return "530 HAVARIE\r\n";
- }
- return "240 OK " + "(" + x + "," + y + ")\r\n";
- }
- if (order.startsWith("OPRAVIT ") && order.length() == 9) {
- if (order.substring(8, 9).equals(String.valueOf(broken))) { //repairing right proc
- broken = 11;
- return "240 OK " + "(" + x + "," + y + ")\r\n";
- }
- if ("0".equals(order.substring(8, 9))) {
- return "500 NEZNAMY PRIKAZ\r\n";
- }
- return "571 PROCESOR FUNGUJE\r\n";
- }
- if (order.equals("end")) {
- return "end";
- }
- return "500 NEZNAMY PRIKAZ\r\n";
- }
- @Override
- public void run() {
- initCommunication();
- String response = "";
- do {
- response = makeDecision(parseOrder(readMsg(in)));
- if (!response.equals("end")) {
- out.print(response);
- out.flush();
- }
- } while (client.isConnected()
- && (response.startsWith("210")
- || response.startsWith("500")
- || response.startsWith("580")
- || response.startsWith("240")));
- //close session
- out.close();
- try {
- client.close();
- System.out.println("Succesfully closing session for client " + client.getInetAddress() + ":" + client.getPort());
- } catch (IOException ex) {
- System.out.println("Unsuccesfully closing session for client " + client.getInetAddress() + ":" + client.getPort());
- }
- return;
- }
- }
- class Client {
- static String parseName(String msg) {
- String osloveni = "Oslovuj mne ";
- int nameStart = msg.indexOf(osloveni) + osloveni.length();
- int nameEnd = msg.indexOf(".", nameStart);
- return msg.substring(nameStart, nameEnd);
- }
- public static void cli_main(int port, String servername) throws IOException {
- Socket echoSocket = null;
- PrintWriter out = null;
- BufferedReader in = null;
- //init connection
- try {
- echoSocket = new Socket(servername, port);
- out = new PrintWriter(echoSocket.getOutputStream(), true);
- in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
- } catch (UnknownHostException e) {
- System.err.println("Unknown host: " + servername);
- System.exit(1);
- } catch (IOException e) {
- System.err.println("Couldn't get I/O for " + servername);
- System.exit(1);
- }
- int code = 0, x = 0, y = 0, pX = 0, pY = 0;
- String request = "", response = "", name = "";
- while (echoSocket.isConnected() && !(code == 260 || code == 530 || code == 550 || code == 571 || code == 572)) {
- response = "";
- while (!response.endsWith("\r\n")) {
- response += (char) in.read();
- }
- //print response
- System.out.print("Receiving: " + response);
- try {
- code = Integer.parseInt(response.substring(0, 3));
- } catch (Exception e) {
- System.err.println("Recieved message without code");
- System.exit(1);
- }
- if (code == 210) {//initial communication
- System.out.println("Parsed name: " + (name = parseName(response)));
- request = name + " VLEVO\r\n";
- }
- if (code == 580) { //processor damaged
- request = name + " OPRAVIT "
- + response.substring(response.length() - 3, response.length() - 2) //proc number
- + "\r\n";
- }
- if (code == 240) { //OK, bot is ready
- //AI goes here
- x = Integer.parseInt(response.substring(response.indexOf("(") + 1, response.indexOf(",")));
- y = Integer.parseInt(response.substring(response.indexOf(",") + 1, response.indexOf(")")));
- if (Math.abs(y) < Math.abs(pY) || Math.abs(x) < Math.abs(pX)) { //i am closer than last time
- request = name + " KROK\r\n";
- } else {
- request = name + " VLEVO\r\n"; //last time i went wrong
- }
- if (x == 0 && y == 1) {
- request = name + " VLEVO\r\n";
- }
- if (x == 0 && y == 0) { //im done
- request = name + " ZVEDNI\r\n";
- }
- if (x == pX && y == pY) { //no move last time
- request = name + " KROK\r\n";
- }
- }
- if (code != 260) {
- pX = x;
- pY = y;
- out.print(request); //send request to server
- out.flush(); //flush after each message
- System.out.println("sending: " + request);
- }
- }
- //end transmision
- System.out.println("\nConnection closed by foreign host: " + echoSocket.getInetAddress() + "\n");
- out.close();
- in.close();
- echoSocket.close();
- }
- }
- public class Robot {
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) throws IOException {
- switch (args.length) {
- case 1:
- System.out.println("Starting server...\n");
- Server.svr_main(Integer.parseInt(args[0]));
- break;
- case 2:
- System.out.println("Starting client...\n");
- Client.cli_main(Integer.parseInt(args[1]), args[0]);
- break;
- default:
- System.err.println("Client: java robot.Robot <hostname> <port>");
- System.err.println("Server: java robot.Robot <port>");
- System.exit(1);
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement