1、简单 echo server
import socket
import selectors
selec = selectors.DefaultSelector()
print(selec)
server = socket.socket()
server.bind(('127.0.0.1', 9999))
server.listen()
server.setblocking(False)
def accept(conn:socket.socket, mask:int):
conn, raddr = server.accept()
conn.setblocking(False)
key = selec.register(conn, selectors.EVENT_READ, recv)
print(key)
print('conn', conn)
print('raddr', raddr)
def recv(conn:socket.socket, mask:int):
data = conn.recv(1024)
print(data)
msg = 'Your msg = {} from {}'.format(data.decode(), conn.getpeername()).encode()
print(msg.decode())
conn.send(msg)
key = selec.register(server, selectors.EVENT_READ, accept)
print(key)
print(type(key))
print(key.__class__.mro())
while True:
events = selec.select()
print(events)
for key, mask in events:
print(type(key), type(mask))
print(key.data)
key.data(key.fileobj, mask)
server.close()
selec.close()
<selectors.SelectSelector object at 0x000001EA3F596F10>
SelectorKey(fileobj=<socket.socket fd=388, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999)>, fd=388, events=1, data=<function accept at 0x000001EA3F3BD280>)
<class 'selectors.SelectorKey'>
[<class 'selectors.SelectorKey'>, <class 'tuple'>, <class 'object'>]
[(SelectorKey(fileobj=<socket.socket fd=388, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999)>, fd=388, events=1, data=<function accept at 0x000001EA3F3BD280>), 1)]
<class 'selectors.SelectorKey'> <class 'int'>
<function accept at 0x000001EA3F3BD280>
SelectorKey(fileobj=<socket.socket fd=384, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 63364)>, fd=384, events=1, data=<function recv at 0x000001EA3F73DAF0>)
conn <socket.socket fd=384, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 63364)>
raddr ('127.0.0.1', 63364)
[(SelectorKey(fileobj=<socket.socket fd=388, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999)>, fd=388, events=1, data=<function accept at 0x000001EA3F3BD280>), 1)]
<class 'selectors.SelectorKey'> <class 'int'>
<function accept at 0x000001EA3F3BD280>
SelectorKey(fileobj=<socket.socket fd=360, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 63367)>, fd=360, events=1, data=<function recv at 0x000001EA3F73DAF0>)
conn <socket.socket fd=360, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 63367)>
raddr ('127.0.0.1', 63367)
[(SelectorKey(fileobj=<socket.socket fd=388, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999)>, fd=388, events=1, data=<function accept at 0x000001EA3F3BD280>), 1)]
<class 'selectors.SelectorKey'> <class 'int'>
<function accept at 0x000001EA3F3BD280>
SelectorKey(fileobj=<socket.socket fd=356, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 63369)>, fd=356, events=1, data=<function recv at 0x000001EA3F73DAF0>)
conn <socket.socket fd=356, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 63369)>
raddr ('127.0.0.1', 63369)
[(SelectorKey(fileobj=<socket.socket fd=384, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 63364)>, fd=384, events=1, data=<function recv at 0x000001EA3F73DAF0>), 1)]
<