示例#1
0
class Channel(BaseChannel):
    """
    """
    
    def __init__(self, ):
        """
        """
        super(BaseChannel, self).__init__()
        self._stream = None
        self._pendings = {}
        self._logger = logging.getLogger('gprotobuf.Channel')

    def connectTCP(self, host, port):
        """
        
        Arguments:
        - `self`:
        - `host`:
        - `port`:
        """
        self._address = (host, port)
        self._connect()
        self._logger.info('Connected to {0}:{1}'.format(host, port))

    def connectUnix(self, path):
        """
        
        Arguments:
        - `self`:
        - `path`:
        """
        self._address = path
        self._connect()
        self._logger.info('Connected to {0}'.format(path))

    def _connect(self, ):
        """
        """
        assert self._stream == None or self._stream.closed()
        if isinstance(self._address, str):
            s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        else:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(10)
        s.connect(self._address)
        self._stream = IOStream(s)
        self._stream.read_bytes(struct.calcsize("!I"), self._get_buffer_size)

    def close(self):
        ''' '''
        self._stream and self._stream.close()

    def isClosed(self):
        ''' '''
        return self._stream and self._stream.closed()
    
    def reconnect(self):
        """
        
        Arguments:
        - `self`:
        """
        assert self._address != None
        self._connect()

    def _write_request(self, buffer):
        """
        
        Arguments:
        - `self`:
        - `buffer`:
        """
        bufferLen = struct.pack("!I", len(buffer))
        buffer = bufferLen + buffer
        self._stream.write(buffer, self._after_write)

    def _after_write(self):
        """
        
        Arguments:
        - `self`:
        """
        self._logger.debug('Send RPC request finished')
        
    def _get_buffer_size(self, buffer):
        """
        
        Arguments:
        - `self`:
        - `buffer`:
        """
        bufferLen = int(struct.unpack("!I", buffer)[0])
        self._stream.read_bytes(bufferLen, self._after_read_response)

    def _after_read_response(self, data):
        """
        
        Arguments:
        - `self`:
        - `data`:
        """
        try:
            self._logger.debug('Receive RPC response finished')
            response = self.deserialize_response(data)
            uuid = response.uuid
            if uuid in self._pendings:
                if response.type == RESPONSE_OK:
                    resultClass = self._pendings[uuid][1]
                    #controller = self._pendings[uuid][2]
                    result = self.deserialize_result(response, resultClass)
                    self._pendings[uuid][0](result)
                elif response.type == RESPONSE_ERROR:
                    self._logger.error(response.error)
                del self._pendings[uuid]
        except:
            pass
        self._logger.debug('RPC invoke finished')
        if not self._stream.closed():
            self._stream.read_bytes(struct.calcsize("!I"), self._get_buffer_size)

    def CallMethod(self, methodDescriptor, controller, parameters, resultClass, done):
        ''' '''
        self._logger.debug('Start RPC invoke')
        (uuid, request) = self.serialize_request(methodDescriptor, parameters)
        try:
            self._write_request(request)
            self._pendings[uuid] = (done, resultClass, controller)
        except IOError, err:
            controller.SetFailed(str(err))
            self._logger.error('{0}'.format(err))
示例#2
0
class Channel(BaseChannel):
    """
    """

    def __init__(self,):
        """
        """
        super(BaseChannel, self).__init__()
        self._stream = None
        self._pendings = {}
        self._logger = logging.getLogger("gprotobuf.Channel")

    def connectTCP(self, host, port):
        """
        
        Arguments:
        - `self`:
        - `host`:
        - `port`:
        """
        self._address = (host, port)
        self._connect()
        self._logger.info("Connected to {0}:{1}".format(host, port))

    def connectUnix(self, path):
        """
        
        Arguments:
        - `self`:
        - `path`:
        """
        self._address = path
        self._connect()
        self._logger.info("Connected to {0}".format(path))

    def _connect(self,):
        """
        """
        assert self._stream == None or self._stream.closed()
        if isinstance(self._address, str):
            s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        else:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(10)
        s.connect(self._address)
        self._stream = IOStream(s)
        self._stream.read_bytes(struct.calcsize("!I"), self._get_buffer_size)

    def close(self):
        """ """
        self._stream and self._stream.close()

    def isClosed(self):
        """ """
        return self._stream and self._stream.closed()

    def reconnect(self):
        """
        
        Arguments:
        - `self`:
        """
        assert self._address != None
        self._connect()

    def _write_request(self, buffer):
        """
        
        Arguments:
        - `self`:
        - `buffer`:
        """
        bufferLen = struct.pack("!I", len(buffer))
        buffer = bufferLen + buffer
        self._stream.write(buffer, self._after_write)

    def _after_write(self):
        """
        
        Arguments:
        - `self`:
        """
        self._logger.debug("Send RPC request finished")

    def _get_buffer_size(self, buffer):
        """
        
        Arguments:
        - `self`:
        - `buffer`:
        """
        bufferLen = int(struct.unpack("!I", buffer)[0])
        self._stream.read_bytes(bufferLen, self._after_read_response)

    def _after_read_response(self, data):
        """
        
        Arguments:
        - `self`:
        - `data`:
        """
        try:
            self._logger.debug("Receive RPC response finished")
            response = self.deserialize_response(data)
            uuid = response.uuid
            if uuid in self._pendings:
                if response.type == RESPONSE_OK:
                    resultClass = self._pendings[uuid][1]
                    # controller = self._pendings[uuid][2]
                    result = self.deserialize_result(response, resultClass)
                    self._pendings[uuid][0](result)
                elif response.type == RESPONSE_ERROR:
                    self._logger.error(response.error)
                del self._pendings[uuid]
        except:
            pass
        self._logger.debug("RPC invoke finished")
        if not self._stream.closed():
            self._stream.read_bytes(struct.calcsize("!I"), self._get_buffer_size)

    def CallMethod(self, methodDescriptor, controller, parameters, resultClass, done):
        """ """
        self._logger.debug("Start RPC invoke")
        (uuid, request) = self.serialize_request(methodDescriptor, parameters)
        try:
            self._write_request(request)
            self._pendings[uuid] = (done, resultClass, controller)
        except IOError, err:
            controller.SetFailed(str(err))
            self._logger.error("{0}".format(err))