class TcpConnection(object): def __init__(self, loop, socket, peeraddr): self.loop_ = loop self.socket_ = Socket(socket) self.peeraddr_ = peeraddr self.events_ = Events(self.socket_.getSocketFd(), kEevntRead) self.handle_ = Handle(self.events_) self.recvBuffer_ = '' self.writeBuffer_ = '' self.messageCb_ = defMessageCallback def tcpConnectionHandRead(self, reventFd, reventMask): assert reventFd == self.socket_.getSocketFd() data = '' length = 30 while True: try: data = self.socket_.recv(length) except error, e: if e.errno == errno.EAGAIN: break if len(data) == 0: self.loop_.delHandle(self.handle_) self.recvBuffer_ = '' break else: self.recvBuffer_ += data if len(self.recvBuffer_) != 0: self.messageCb_(self, self.recvBuffer_) self.recvBuffer_ = ''
class TcpServer(object): def __init__(self, loop): self.loop_ = loop self.serversd_ = Socket() self.serversd_.bind() self.serversd_.listen(100) self.conns_ = {} self.events_ = Events(self.serversd_.getSocketFd(), kEevntRead) self.handle_ = Handle(self.events_, self.serverReadCb) self.loop_.addHandle(self.handle_) self.messageCb_ = defMessageCallback def initNewConn(self, acceptRet): print "initNewConn" client = acceptRet[0] peeraddr = acceptRet[1] conn = TcpConnection(self.loop_, client, peeraddr) conn.setMessageCallback(self.messageCb_) conn.connectionInit() self.conns_[client.fileno()] = conn def setMessageCallback(self, messagecb=defMessageCallback): self.messageCb_ = messagecb def serverReadCb(self, reventFd, reventMask): print "serverReadCb" assert reventFd == self.serversd_.getSocketFd() #(socket object, address info) newconn = self.serversd_.accept() self.initNewConn(newconn)