def __init__(self, gamestarttime):
        """Initialize the CommandProcessor."""

        self.nibbleclientdict = {}
        self.engine = None
        self.server = None
        self.gamestarttime = gamestarttime.strftime("%Y-%m-%d %H:%M:%S")
        self._logger = NibbleStreamLogger("server.commandprocessor", logging.INFO)
Beispiel #2
0
    def __init__(self, commandProcessor, socket, clientNumber=0, threadDelay=1):
        """Initialize the ClientHandler.
                Arguments:
                    commandProcessor -- (CommandProcessor)
                    socket -- (Socket)
                    clientNumber -- (integer) individual number of the client
                    threadDelay -- (integer) This is the number of seconds execution to be suspended. """

        threading.Thread.__init__(self)
        self.socket = socket
        self.clientNumber = clientNumber
        self.commandProcessor = commandProcessor
        self.threadDelay = threadDelay

        # create logger
        self._logger = NibbleStreamLogger("server.network.clientHandler.%d" % self.clientNumber, logging.INFO)
        # execute the thread
        self.start()
Beispiel #3
0
class ClientHandler(threading.Thread):
    def __init__(self, commandProcessor, socket, clientNumber=0,
                 threadDelay=1):
        """Initialize the ClientHandler.
                Arguments:
                    commandProcessor -- (CommandProcessor)
                    socket -- (Socket)
                    clientNumber -- (integer) individual number of the client
                    threadDelay -- (integer) This is the number of seconds execution to be suspended. """

        threading.Thread.__init__(self)
        self.socket = socket
        self.clientNumber = clientNumber
        self.commandProcessor = commandProcessor
        self.threadDelay = threadDelay

        # create logger
        self._logger = NibbleStreamLogger(
            "server.network.clientHandler.%d" % self.clientNumber,
            logging.INFO)
        # execute the thread
        self.start()

    def send(self, messageString):
        """Send messageString to the client.
                Arguments:
                    messageString -- (string)"""
        self._logger.info('"' + messageString + '" was sent to client')
        self.socket.sendall(messageString)

    def run(self):
        """Listens on the client.
                Arguments:
                    delay --  (integer) defined in seconds."""

        BUF_SIZE = 1024
        self.data = None
        while True:
            time.sleep(self.threadDelay)
            try:
                self.data = self.socket.recv(BUF_SIZE)
            except Exception as e:
                self._logger.warning('Unable to receive data from client')
                #raise e

            if self.data:
                self._logger.info('Received: "' + self.data + '"')
                self.commandProcessor.receive(self.data, self.clientNumber)
                self.data = ''
Beispiel #4
0
    def __init__(self, commandProcessor, HOST, PORT, threadDelay):
        """Initializes the server.
                Arguments:
                    commandProcessor -- (CommandProcessor)
                    HOST -- (string)
                    PORT -- (integer)
                    threadDelay -- (integer) This is the number of seconds execution to be suspended"""

        # create logger
        self._logger = NibbleStreamLogger("server.network.server", logging.INFO)

        self.commandProcessor = commandProcessor
        self.clientList = []

        try:
            self.listenThreadServer = threading.Thread(target=self.listen, args=(HOST, PORT, threadDelay))
            self.listenThreadServer.start()
            self._logger.info('Serverthread started!')
        except:
            self._logger.warning('Unable to start listenThreadServer')
Beispiel #5
0
class Server():
    def __init__(self, commandProcessor, HOST, PORT, threadDelay):
        """Initializes the server.
                Arguments:
                    commandProcessor -- (CommandProcessor)
                    HOST -- (string)
                    PORT -- (integer)
                    threadDelay -- (integer) This is the number of seconds execution to be suspended"""

        # create logger
        self._logger = NibbleStreamLogger("server.network.server", logging.INFO)

        self.commandProcessor = commandProcessor
        self.clientList = []

        try:
            self.listenThreadServer = threading.Thread(target=self.listen, args=(HOST, PORT, threadDelay))
            self.listenThreadServer.start()
            self._logger.info('Serverthread started!')
        except:
            self._logger.warning('Unable to start listenThreadServer')

    def setjoin(self):
        self.listenThreadServer.join()

    def listen(self, HOST='', PORT=1234, threadDelay=1):
        """Listens to the socket.
                Arguments:
                    HOST --  (string).
                    PORT --  (integer).
                    delay -- (integer) This is the number of seconds execution to be suspended"""
        self.threadDelay = threadDelay
        self.HOST = HOST
        self.PORT = PORT
        self.clientNumber = 0

        self.s = socket.socket()
        self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        try:
            self.s.bind((self.HOST, self.PORT))
        except:
            self._logger.warning('Unable to bind HOST and PORT to the socket!')

        self._logger.info('Serversocket .bind succeeded: HOST %s, PORT %s'  %(self.HOST, self.PORT))
        self._logger.info('Waiting for clients.')
        self.s.listen(1)

        while True:
            c, (clienthost, clientport) = self.s.accept()
            self._logger.info('Connected with %s:%d and allocated to id %d' % (clienthost, clientport,self.clientNumber))
            self.clientList.insert(self.clientNumber ,ClientHandler(self.commandProcessor, c, self.clientNumber, self.threadDelay))
            self.clientNumber += 1

    def sendTo(self, currentClientNumber=0, message=''):
        """Sends messages to the specific client.
                Arguments:
                    currentClientNumber -- (integer)
                    message -- (string) """
        self._logger.info('"' + message + '" was sent to the client with the id %d' % currentClientNumber)
        self.clientList[currentClientNumber].send(message)
class CommandProcessor():
    def __init__(self, gamestarttime):
        """Initialize the CommandProcessor."""

        self.nibbleclientdict = {}
        self.engine = None
        self.server = None
        self.gamestarttime = gamestarttime.strftime("%Y-%m-%d %H:%M:%S")
        self._logger = NibbleStreamLogger("server.commandprocessor", logging.INFO)

    def setserver(self, server):
        """Receives the instanz of the server and stores it.
                Arguments:
                    server -- (Server)"""
        self.server = server
        self._logger.info('Server has been set')

    def setengine(self, engine):
        """Receives the instanz of the engine and stores it.
                Arguments:
                    engine -- (Engine)"""
        self.engine = engine
        self._logger.info('Engine has been set')

    def receive(self, data, clientNumber):
        """Receives and handles the messages from the clients.
                Arguments:
                    data --  (string).
                    clientNumber --  (integer)"""

        data = data.strip()
        self._logger.info('Receive "' + data + '" from id %d' % clientNumber)

        if data == 'anmeldung moeglich@':
            if self.engine.getgamestatus() == INIT:
                    self.server.sendTo(clientNumber, 'ja@')
            else:
                    self.server.sendTo(clientNumber, 'nein@')
        elif data == 'anmelden@':
            if clientNumber in self.nibbleclientdict.values():
                self.server.sendTo(clientNumber, 'fehler@')
            else:
                nibblechar = None
                try:
                    nibblechar = self.engine.register()
                    self.nibbleclientdict[nibblechar] = clientNumber
                except RegisterNibbleFailedException, m:
                    logging.warning(m)
                    logging.warning('Anmeldung von %d mit Buchstabe %s nicht moeglich!' %(clientNumber,nibblechar))
                if nibblechar != None:
                    self.server.sendTo(clientNumber, '%s@' %nibblechar)

        elif clientNumber in self.nibbleclientdict.values():
            if data == 'weltgroesse@':
                if self.engine.getgamestatus() == INIT:
                    self.server.sendTo(clientNumber, 'fehler@')
                else:
                    x, y = self.engine.getworlddimensions()
                    self.server.sendTo(clientNumber, '%dx%d@' %(x, y))

            elif data == 'spielbeginn@':
                self.server.sendTo(clientNumber, self.gamestarttime)

            elif 2 <= len(data) <= 3:
                if data.endswith('@'):
                    directionnumber = data.rstrip("@")
                    if directionnumber.isdigit():
                        directionnumber = int(directionnumber)
                        if 0 <= directionnumber <= 24:
                            if self.engine.execturn(self.nibbleclientdict.keys()[self.nibbleclientdict.values().index(clientNumber)], directionnumber) == -1:
                                self._logger.warning("Couldn't execute move")
                                self.server.sendTo(clientNumber, 'fehler@')
                            else:
                                self._logger.info('Movement succeeded!')
                        else:
                            self.server.sendTo(clientNumber, 'fehler4@')
                    else:
                        self.server.sendTo(clientNumber, 'fehler3@')
                else:
                    self.server.sendTo(clientNumber, 'fehler2@')