当我涉足客户端-服务器关系时,我一直遵循这个指南(https://realpython.com/python-sockets/)。在构建多连接服务器/客户端时,我遇到了这个错误:
event read: 1
event write: 2
Traceback (most recent call last):
File "multiconn-server.py", line 8, in <module>
sel = selectors.DefaultSelector()
AttributeError: module 'selectors' has no attribute 'DefaultSelector'
这个解决方案没有帮助:https://github.com/pantsbuild/pants/issues/8845
我目前使用的是Windows 10。我想如果我不能使用/理解选择器(尽管我从指南中编写了代码,但仍然很难理解),我可以使用asyncio代替。如果有帮助的话,下面是代码:
import selectors
import socket
import types
HOST = '127.0.0.1'
PORT = 65432
sel = selectors.DefaultSelector()
def service_connection(key, mask):
sock = key.fileobj
data = key.data
if mask & selectors.EVENT_READ:
recv_data = sock.recv(1024) # should be ready to read
if recv_data:
data.outb += recv_data
else:
print('closing connection to', data.addr)
sel.unregister(sock)
sock.close()
if mask & selectors.EVENT_WRITE:
if data.outb:
print('echoing', repr(data.outb), 'to', data.addr)
sent = sock.send(data.outb) # should be ready to write
data.outb = data.outb[sent:]
def accept_wrapper(sock):
conn, addr = sock.accept() # socket object and address returned
print('accepted connection from', addr)
conn.setblocking(False)
data = types.simpleNamespace(addr=addr, inb=b'', outb=b'')
events = selectors.EVENT_READ | selectors.EVENT_WRITE
sel.register(conn, events, data=data)
# listening socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as lsock:
lsock.bind((HOST, PORT))
lsock.listen()
print('listening on', (HOST, PORT))
lsock.setblocking(False) # socket can no longer block
sel.register(lsock, selectors.EVENT_READ, data=None) # monitored with select() for events you're interested in
while True:
events = sel.select(timeout=None) # blocks until there are sockets ready for I/O
# we wait for events on one or more sockets
for key, mask in events:
if key.data is None:
accept_wrapper(key.fileobj)
else:
service_connection(key, mask)
我找到了我的解决方案:https://luxiyalu.com/attributeerror-module-selectors-has-no-attribute-selectselector/显然我的select.py
的文件名干扰了什么。当我重命名我的文件时,它就解决了。