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 __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()
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 = ''
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')
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@')