class AdvancedDispatcher(asyncore.dispatcher): _buf_len = 131072 def __init__(self, sock): asyncore.dispatcher.__init__(self, sock) self.read_buf = "" self.write_buf = "" self.state = "init" def slice_read_buf(length=0): self.read_buf = self.read_buf[length:] def slice_write_buf(length=0): self.write_buf = self.read_buf[length:] def read_buf_sufficient(length=0): if len(self.read_buf) < length: return False else: return True def process(self): if len(self.read_buf) == 0: return while True: try: if getattr(self, "state_" + str(self.state))() is False: break except AttributeError: # missing state raise def set_state(self, state, length): self.slice_read_buf(length) self.state = state def writable(self): return len(self.write_buf) > 0 def readable(self): return len(self.read_buf) < AdvancedDispatcher._buf_len def handle_read(self): self.read_buf += self.recv(AdvancedDispatcher._buf_len) self.process() def handle_write(self): written = self.send(self.write_buf) self.slice_write_buf(written) # self.process()