@Override
    public void run() {
        //say our server is starting
        logger.debug("Server starting");

        //set this in case it was set to false
        keepRunning = true;

        //set up some buffer for ourselves
        byte[] recvData = new byte[64];

        logger.debug("About to enter server control loop");
        //we have a socket, we should do something with the socket
        while ( keepRunning ) {
            try {
                recvData = new byte[64];
                DatagramPacket recvPacket = new DatagramPacket(recvData, recvData.length);
                socket.receive(recvPacket);
                this.clientInetAddress = recvPacket.getAddress();

                String sentence = new String( recvPacket.getData() );
                sentence = sentence.trim(); //take off the padding crap from the byte array

                /**
                 * take the inbound sentence, give it to a new request thread, and send it on its merry way
                 * The request object if need be can send off a response to the client
                 */
                Request req = new Request();
                req.setLogger(logger);
                req.handle(sentence, this);

                if  ( req.hasResponse() ) {
                    this.client.send(req.getResponse());
                }
            } catch (Exception e) {
                e.printStackTrace();
                //drop out of the while loop
                logger.debug("Leaving server loop unexpectedly");
                break;
            }
        }

        logger.debug("Server will no longer be responsive to packets");

        try {
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
            logger.debug("Problem stopping socket");
        }
    }