예제 #1
0
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()