在此代码中:
if __name__ == "__main__":
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.bind(("127.0.0.1", 4000))
while True:
soc.listen(5)
conn, address = soc.accept()
data = conn.recv(32)
print(f"got data: {data}")
conn.sendall(response.encode())
conn.shutdown(socket.SHUT_WR)
将 shutdown 替换为 close 时,尝试使用curl
curl http://localhost:4000
回复:
curl: (56) Recv failure: Connection was reset
但是使用关机通常效果很好,我也注意到了 使用 close + time.sleep 或在其后打印,它会正常工作
这种行为的原因是什么?我知道关闭是半关闭,这意味着它可以从连接接收更多数据
但是新的卷曲意味着新的连接,对吧?
如果调用 close,即使尚未读取所有数据,也会触发连接重置。在您的情况下,服务器仅从客户端读取 32 个字节,即使请求可能更大。
当使用关闭或延迟关闭(使用睡眠或打印)时,客户端可能已经关闭连接并向服务器发出信号。由于在这种情况下连接关闭是由客户端发起的,因此即使服务器端有未读数据,服务器也不需要重置它。