示例#1
0
    def pool(self):
        readable, writable, exception = select.select(
            self.connection_inputs,
            self.connection_outputs,
            self.connection_inputs,
        )

        for s in readable:
            if s is self.socket:
                """Incoming connection"""

                new_connection, new_address = s.accept()
                address = "%s:%s" % new_address
                log.info("Client %s connected" % (address))
                s.setblocking(False)

                self.connection_inputs.append(new_connection)
                self.connections[address] = ConnectionSocket(
                    use_socket=new_connection)
                self.message_queues[new_connection] = Queue.Queue()

                signals.emit('connection:connected', self.connections[address])
            else:
                """Current connection"""

                try:
                    address = "%s:%s" % s.getpeername()
                except socket.error:
                    try:
                        self.connection_outputs.remove(s)
                    except ValueError:
                        pass

                data = self.connections[address].recv()
                if data:
                    self.message_queues[s].put(data)

                    if s not in self.connection_outputs:
                        self.connection_outputs.append(s)

                    signals.emit('connection:data_received',
                                 self.connections[address], data)
                else:
                    log.info("Client %s disconnected" % address)

                    signals.emit('connection:disconnected', address)

                    if s in self.connection_outputs:
                        self.connection_outputs.remove(s)
                        writable.remove(s)

                    self.connection_inputs.remove(
                        self.connections[address].socket)
                    self.connections[address].socket.close()

                    del self.message_queues[s]
                    del self.connections[address]

        for s in writable:
            try:
                next_msg = self.message_queues[s].get_nowait()
            except Queue.Empty:
                address = "%s:%s" % s.getpeername()
                self.connection_outputs.remove(s)
            else:
                try:
                    address = "%s:%s" % s.getpeername()
                except socket.error:
                    self.connection_outputs.remove(s)

        for s in exception:
            address = "%s:%s" % connection.socket.getpeername()

            log.critical("Handling exceptional condition for %s!" % address)
            self.connection_inputs.remove(s)
            if s in self.connection_outputs:
                self.connection_outputs.remove(s)
            self.connections[address].socket.close()

            del self.connections[address]

        return True