事件驱动IO-udp

来源:互联网 发布:知乎北京五中大厂分校 编辑:程序博客网 时间:2024/06/15 03:11

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 UDPServer(EventHandler):    def __init__(self, address):        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)        self.sock.bind(address)    def fileno(self):        return self.sock.fileno()    def wants_to_receive(self):        return Trueclass UDPTimeServer(UDPServer):    def handle_receive(self):        msg, addr = self.sock.recvfrom(1)        self.sock.sendto(time.ctime().encode('ascii'), addr)class UDPEchoServer(UDPServer):    def handle_receive(self):        msg, addr = self.sock.recvfrom(8192)        self.sock.sendto(msg, addr)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()]        print(wants_recv,wants_send)        can_recv, can_send, _ = select.select(wants_recv, wants_send, [])        print(can_recv,can_send)        for h in can_recv:            h.handle_receive()        for h in can_send:            h.handle_send()if __name__ == '__main__':    handlers = [UDPEchoServer(('', 15000))]    # handlers = [UDPTimeServer(('', 14000)), UDPEchoServer(('', 15000))]    event_loop(handlers)


c.py

from socket import *s = socket(AF_INET, SOCK_DGRAM)s.sendto(b'hello',('localhost',15000))print(s.recvfrom(128))



0 0