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 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 = ''