python-selector模块

server:

import selectors
import socket

# sel = selectors.DefaultSelector()
#
# def accept(sock, mask):
#     conn, addr = sock.accept()  # Should be ready
#     print('accepted', conn, 'from', addr)
#     conn.setblocking(False)
#     sel.register(conn, selectors.EVENT_READ, read)
#
# def read(conn, mask):
#     data = conn.recv(1024)  # Should be ready
#     if data:
#         print('echoing', repr(data), 'to', conn)
#         conn.send(data)  # Hope it won't block
#     else:
#         print('closing', conn)
#         sel.unregister(conn)
#         conn.close()
#
#
# sock = socket.socket()
# sock.bind(('localhost', 10000))
# sock.listen(100)
# sock.setblocking(False)
# sel.register(sock, selectors.EVENT_READ, accept)
# while True:
#     events = sel.select()  #m默认阻塞,有活动连接就返回活动连接列表
#     for key, mask in events:
#         callback = key.data   #accept
#         callback(key.fileobj, mask)
#




class Server(object):
    def __init__(self,sel,sock):
        self.sel = sel
        self.sock = sock


    def run(self,host,port):
        self.sock.bind((host,port))
        self.sock.listen(1000)
        self.sock.setblocking(False)
        self.sel.register(sock, selectors.EVENT_READ, self.accept)
        while True:
            events = self.sel.select()  # m默认阻塞,有活动连接就返回活动连接列表
            for key, mask in events:
                callback = key.data  # accept
                callback(key.fileobj, mask)

    def accept(self, sock,mask):
        conn, addr = sock.accept()  # Should be ready
        print('accepted', conn, 'from', addr)
        conn.setblocking(False)
        sel.register(conn, selectors.EVENT_READ, self.read)

    def read(self,conn, mask):
        data = conn.recv(1024)  # Should be ready
        if data:
            print('echoing', repr(data), 'to', conn)
            conn.send(data)  # Hope it won't block
        else:
            print('closing', conn)
            sel.unregister(conn)
            conn.close()

if __name__== '__main__':
    sel = selectors.DefaultSelector()
    sock = socket.socket()
    host,port = 'localhost',10000
    server_obj = Server(sel,sock)
    server_obj.run(host,port)

client:

import socket

HOST = 'localhost'
PORT = 10000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
    msg = bytes(input(">>:").strip(), encoding="utf-8")
    if msg == 'q'.encode("utf-8"):
        exit("退出!")
    s.sendall(msg)
    data = s.recv(1024)
    print('Received',data.decode())
s.close()
原文地址:https://www.cnblogs.com/guqing/p/6512246.html