python - 在其他计算机上测试Web服务器时,对等方重置连接

标签 python sockets webserver

我正在测试Python Web服务器。使用本地主机作为服务器和客户端,它可以按预期工作,但是当我在不同的计算机上进行测试时,

[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()

最佳答案

接收功能有错误。更改为:

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上是5。将积压增加到128很有帮助。

关于python - 在其他计算机上测试Web服务器时,对等方重置连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29993807/

相关文章:

python - 调整图像大小,使其大小与指定的宽高比匹配

python - 当输入为不同类型时,Numpy matmul 需要的内存比所需的内存多

c - 查找服务器的IP和端口

nginx - 如何让我的 Dreamweaver 站点使用我的 nginx docker 容器作为 Web 测试服务器?

python - `pip install -e` 的用例是什么?

iOS 客户端,C++ 服务器?

java - Java一对一消息广播套接字

java - MongoDB 中的数据库分片?

c - 将套接字绑定(bind)到 ansi c 中的端口 80

python - 将打印重定向到字符串列表?