コード例 #1
0
ファイル: server.py プロジェクト: namelessvoid/piranhas
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)
コード例 #2
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 = ''