事件驱动IO-tcp

来源:互联网 发布:软件系统开发评估 编辑:程序博客网 时间:2024/06/15 04:07

s.py

import socketimport timeimport selectclass EventHandler:    def fileno(self):        'Return the associated file descriptor'        raise NotImplemented('must implement')    def wants_to_receive(self):        'Return True if receiving is allowed'        return False    def handle_receive(self):        'Perform the receive operation'        pass    def wants_to_send(self):        'Return True if sending is requested'        return False    def handle_send(self):        'Send outgoing data'        passclass TCPServer(EventHandler):    def __init__(self, address, client_handler, handler_list):        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)        self.sock.bind(address)        self.sock.listen(1)        self.client_handler = client_handler        self.handler_list = handler_list    def fileno(self):        return self.sock.fileno()    def wants_to_receive(self):        return True    def handle_receive(self):        client, addr = self.sock.accept()        # Add the client to the event loop's handler list        self.handler_list.append(self.client_handler(client, self.handler_list))        print('''Add the client to the event loop's handler list.''')class TCPEchoClient(EventHandler):    def __init__(self, sock, handler_list):        self.sock = sock        self.handler_list = handler_list        self.outgoing = bytearray()    def wants_to_receive(self):        return True    def handle_receive(self):        data = self.sock.recv(8192)        if not data:            self.close()        else:            self.outgoing.extend(data)        print (data)    def fileno(self):        return self.sock.fileno()    def close(self):        self.sock.close()        # Remove myself from the event loop's handler list        self.handler_list.remove(self)    def wants_to_send(self):        return True if self.outgoing else False    def handle_send(self):        nsent = self.sock.send(self.outgoing)        print (self.outgoing)        self.outgoing = self.outgoing[nsent:]def event_loop(handlers):    while True:        wants_recv = [h for h in handlers if h.wants_to_receive()]        wants_send = [h for h in handlers if h.wants_to_send()]        can_recv, can_send, _ = select.select(wants_recv, wants_send, [])        for h in can_recv:            h.handle_receive()        for h in can_send:            h.handle_send()if __name__ == '__main__':    handlers = []    handlers.append(TCPServer(('', 15000), TCPEchoClient, handlers))    event_loop(handlers)


c.py

from socket import *s = socket(AF_INET, SOCK_STREAM)s.connect(('localhost', 15000))s.send(b'hello')print(s.recv(128))


0 0