【问题标题】:Connection reset by peer when testing web server on different computers在不同计算机上测试 Web 服务器时由对等方重置连接
【发布时间】: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 上有点不同,因为使用环回。您应该将这种异常作为正常的套接字关闭事件来处理。我想即使你有这些例外,你也不会丢失任何数据。

标签: python sockets webserver


【解决方案1】:

接收函数有错误。改成这样:

def receive(self):
    data_string = ''
    while True:
        bytes = self.sock.recv(self.bufsize)
        bytes_str = bytes.decode('UTF-8')
        data_string += bytes_str
        if not bytes:                   
            break
    return data_string

当服务器已经关闭套接字时,旧的接收函数会尝试再次调用recv。新的只调用一次。

也不知道您可以增加侦听套接字积压 > 5,因为 Python 文档通常说 5 是最大值,而在 OS X 上它是 128。将积压增加到 128 会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 2019-03-25
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多