import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Map.Entry; import java.awt.AWTException; import java.awt.Robot; import java.awt.event.KeyEvent; import lc.kra.system.keyboard.GlobalKeyboardHook; import lc.kra.system.keyboard.event.GlobalKeyAdapter; import lc.kra.system.keyboard.event.GlobalKeyEvent; class Client { // initialize socket and input output streams private Socket socket = null; private DataInputStream input = null; private DataOutputStream out = null; private static boolean run = true; // constructor to put ip address and port public Client(String address, int port) { GlobalKeyboardHook keyboardHook = new GlobalKeyboardHook(true); // Use false here to switch to hook instead of raw input System.out.println("Global keyboard hook successfully started, press [escape] key to shutdown. Connected keyboards:"); for (Entry keyboard : GlobalKeyboardHook.listKeyboards().entrySet()) { System.out.format("%d: %s\n", keyboard.getKey(), keyboard.getValue()); } keyboardHook.addKeyListener(new GlobalKeyAdapter() { @Override public void keyPressed(GlobalKeyEvent event) { try { switch (event.getVirtualKeyCode()){ case GlobalKeyEvent.VK_RETURN:{ out.writeUTF("FOLLOW"); }break; case GlobalKeyEvent.VK_NUMPAD8: case GlobalKeyEvent.VK_UP:{ out.writeUTF("FORWARD"); }break; case GlobalKeyEvent.VK_NUMPAD5: case GlobalKeyEvent.VK_DOWN:{ out.writeUTF("BACKWARD"); }break; case GlobalKeyEvent.VK_NUMPAD4: case GlobalKeyEvent.VK_LEFT:{ out.writeUTF("LEFT"); }break; case GlobalKeyEvent.VK_NUMPAD6: case GlobalKeyEvent.VK_RIGHT:{ out.writeUTF("RIGHT"); }break; case GlobalKeyEvent.VK_NUMPAD0: case GlobalKeyEvent.VK_NUMPAD1: case GlobalKeyEvent.VK_1: case GlobalKeyEvent.VK_2: case GlobalKeyEvent.VK_3: case GlobalKeyEvent.VK_Z:{ out.writeUTF("FIGHT"); }break; case GlobalKeyEvent.VK_NUMPAD3: case 110: case GlobalKeyEvent.VK_DELETE:{ out.writeUTF("CHILL"); }break; } } catch (IOException e) { e.printStackTrace(); } if (event.getVirtualKeyCode() == GlobalKeyEvent.VK_ESCAPE) { run = false; } } @Override public void keyReleased(GlobalKeyEvent event) { System.out.println(event); } }); // establish a connection try { socket = new Socket(address, port); System.out.println("Connected"); // takes input from terminal input = new DataInputStream(System.in); // sends output to the socket out = new DataOutputStream( socket.getOutputStream()); } catch (IOException u) { System.out.println(u); return; } // string to read message from input String line = ""; // keep reading until "Over" is input while (!line.equals("Over")) { try { line = input.readLine(); out.writeUTF(line); } catch (IOException i) { System.out.println(i); } } // close the connection try { input.close(); out.close(); socket.close(); keyboardHook.shutdownHook(); } catch (IOException i) { System.out.println(i); } } public static void main(String args[]) { Client client = new Client("127.0.0.1", 5000); } } class Server { //initialize socket and input stream private Socket socket = null; private ServerSocket server = null; private DataInputStream in = null; Robot r; private void PressKeyWithModifier(int modifier,int keycode) { r.keyPress(modifier); r.keyPress(keycode); r.keyRelease(keycode);r.delay(100); r.keyRelease(modifier); } // constructor with port public Server(int port) { try { r = new Robot(); } catch (AWTException e) { e.printStackTrace(); } // starts server and waits for a connection try { server = new ServerSocket(port); System.out.println("Server started"); System.out.println("Waiting for a client ..."); socket = server.accept(); System.out.println("Client accepted"); // takes input from the client socket in = new DataInputStream( new BufferedInputStream(socket.getInputStream())); String line = ""; // reads message from client until "Over" is sent while (!line.equals("Over")) { try { line = in.readUTF(); switch (line){ case "FOLLOW":{ PressKeyWithModifier(KeyEvent.VK_CONTROL,KeyEvent.VK_7); }break; case "FORWARD":{ }break; case "BACKWARD":{ }break; case "LEFT":{ }break; case "RIGHT":{ }break; case "FIGHT":{ }break; case "CHILL":{ }break; default:{ System.out.println("Unknown command: "+line); } } } catch(IOException i) { System.out.println(i); break; } } System.out.println("Closing connection"); // close connection socket.close(); in.close(); } catch(IOException i) { System.out.println(i); } } public static void main(String args[]) { Server server = new Server(5000); } }