【发布时间】:2015-07-11 16:40:24
【问题描述】:
我正在测试一个 Python Web 服务器。它使用 localhost 作为服务器和客户端按预期工作,但是当我在不同的计算机上测试时,我得到了
[Errno 54] 对等方重置连接大约 20% - 80% 的时间,具体取决于我一次生成的客户端线程数。为什么?
代码片段
服务器监听:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((self.interface, self.port))
sock.listen(5)
服务器永远循环,接受客户端连接,产生新线程:
while True:
(clientsock, (ip, port)) = self.sock.accept()
newthread = ClientThread(ip, port, clientsock)
newthread.start()
产生一堆与服务器连接的客户端线程,发送请求文件的消息,然后关闭连接
服务器准备好后向客户端发送消息
self.socket.sendall(message.encode())
消息发送后,关闭连接的写端:
self.socket.shutdown(socket.SHUT_WR)
客户端收到消息(此处出现错误)
def receive(self):
data_string = ''
bytes = self.sock.recv(self.bufsize)
while len(bytes) > 0:
bytes_str = bytes.decode('UTF-8')
data_string += bytes_str
bytes = self.sock.recv(self.bufsize)
return data_string
客户端线程收到消息后,关闭连接:
self.socket.close()
【问题讨论】:
-
你应该分享你的代码(至少是一个简化的)。否则无法回答,
-
@Micheled'Amico,已更新代码。请让我知道这是否有帮助或您需要更多。
-
sock.listen(5)允许积压 5 个待处理的连接请求,因此如果接受速度有点慢,您将得到这种行为 - 常见的网络延迟添加到混合中。当您收到 conn 拒绝反馈时,提高该数字并限制该客户端。 -
我不确定,但也许这是正确的行为 stackoverflow.com/questions/1434451/… 。当你关闭你的套接字时,你会发送一个重置 pck。在 localhost 上有点不同,因为使用环回。您应该将这种异常作为正常的套接字关闭事件来处理。我想即使你有这些例外,你也不会丢失任何数据。