class Connection: def __init__(self, loop, sock): ch = Channel(loop, sock) self.loop = loop self.connected = True self.ch = ch self.sock = sock self.addr = sock.getpeername() self.readbuf = Buffer() self.writebuf = Buffer() self.ch.readcallback = self.onread self.ch.writecallback = self.onwrite self.ch.enableRead() self.readcallback = None self.closecallback = None def Write(self, s): if len(s) == 0: return n = self.sock.send(s) if n != len(s): self.writebuf.Append(s[n:]) self.ch.enableWrite() def Shutdown(self): self.ch.disableRead() self.sock.shutdown(socket.SHUT_WR) def Remote(self): return self.addr def onread(self): s = self.sock.recv(4096) if len(s) == 0: logging.debug('sock %d eof', self.sock.fileno()) self.close() return self.readbuf.Append(s) self.readcallback(self, self.readbuf) def onwrite(self): n = self.writebuf.Send(self.sock) if self.writebuf.Len() == 0: self.ch.disableWrite() def close(self): self.ch.disableRead() self.ch.disableWrite() self.connected = False self.closecallback(self) self.Shutdown() self.loop.remove(self.ch) self.sock.close()