code: def read(self):
          
          if not self.ready_to_read():
              return None
  
          data = self._read()
          if data is None:
              return None
  
          return self._parse_message(data)
docs: If there is data available to be read from the transport, reads the data and tries to parse it as a protobuf message.  If the parsing succeeds, return a protobuf object.
          Otherwise, returns None.