code: def read(self, channel):
          
  
          if not self.ssh_channel[channel].recv_ready():
              return
  
          try:
              start = time.time()
              chunk = self.ssh_channel[channel].recv(1024)
              end = time.time()
  
              self.read_speeds.append(len(chunk) / (end-start))
              if len(self.read_speeds) > 20:
                  self.read_speeds = self.read_speeds[10:]
  
          except Exception as error:
              self.connection_error(channel, error)
              raise
  
          if chunk == b'':
              # socket connection broken
              self.connection_error(channel, 'Connection broken')
              return None
  
          # self.read_buffer.seek(0, 2) #make sure we write at the end
          self.read_unpacker.feed(chunk)
  
          # self.read_buffer.seek(0)
          messages = [m for m in self.read_unpacker]
  
          return messages if messages else None
docs: Reads from the socket and tries to unpack the message. If successful (because msgpack was able to unpack)
          then we return that message. Else None. Keep calling .read() when new data is available so we try it
          again.