Python 再次led(因为写入事件总是触发,请参见上文),您的代码将在空的数据.outb上绊倒

Python 再次led(因为写入事件总是触发,请参见上文),您的代码将在空的数据.outb上绊倒,python,sockets,printing,Python,Sockets,Printing,如果存在此延迟,则套接字将关闭(因此不再触发事件_WRITE),因为客户端在收到数据后立即关闭连接: ls.recv(1024) ls.close() 请注意,由于您在同一台计算机上使用客户机和服务器,所以这种方式仅适用于此。如果这些都在不同的机器上,那么网络延迟会增加足够多的时间差异,因此您可能会看到不同但可能相似的混淆行为 处理这种情况的正确方法当然是只有在data.outb中确实有数据时才启用EVENT\u WRITE,并在发送所有数据时立即禁用它。您确定在添加/删除print语句时没有

如果存在此延迟,则套接字将关闭(因此不再触发
事件_WRITE
),因为客户端在收到数据后立即关闭连接:

ls.recv(1024)
ls.close()
请注意,由于您在同一台计算机上使用客户机和服务器,所以这种方式仅适用于此。如果这些都在不同的机器上,那么网络延迟会增加足够多的时间差异,因此您可能会看到不同但可能相似的混淆行为


处理这种情况的正确方法当然是只有在
data.outb
中确实有数据时才启用
EVENT\u WRITE
,并在发送所有数据时立即禁用它。

您确定在添加/删除
print
语句时没有更改
的缩进吗再次仔细检查,结果是一样的。额外的
print
语句可以更改异步事件的时间。用时间交换打印。sleep(1)。如果这与print语句的行为相同:这是一个竞争条件,您需要通过检查来处理它。@Barmar Ok,这将解释该行为。你知道有什么来源可以很好地解释这类事件吗?你确定你在添加/删除
print
语句时没有更改
else:
的缩进吗?我再次仔细检查了它,是的,结果是一样的。额外的
print
语句可以更改异步事件的时间。用时间交换打印。sleep(1)。如果这与print语句的行为相同:这是一个竞争条件,您需要通过检查来处理它。@Barmar Ok,这将解释该行为。你知道有什么资料可以很好地解释这类事件吗?
Server listening on ('127.0.0.1', 65433)
new connection ('127.0.0.1', 58678) accepted
echoing b'Hi world' to ('127.0.0.1', 58678)
nothing to send
events = selectors.EVENT_READ | selectors.EVENT_WRITE
...
sel.register(connected_sock, events, data=data)
ls.connect((HOST, PORT))
ls.send(b'Hi world')
def service_connection(key, event):
    ...
    if event & selectors.EVENT_READ:
        ...
    elif event & selectors.EVENT_WRITE:
        ...
        sent = connected_sock.send(data.outb)
        data.outb = data.outb[sent:]
        print('ANYTHING') # removing this changes socket behaviour
ls.recv(1024)
ls.close()