python中利用TCP循环发送文件为什么会很慢

 这是服务端(不好使)的代码

# 1、导入模块
import socket

# 2、创建套接字
tcp_socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 调整套接字的权限
tcp_socket_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

# 3、绑定端口和地址
tcp_socket_server.bind(("", 9090))

# 4、开始监听,将套接字设置为被动监听模式
tcp_socket_server.listen(128)

while True:
    # 5、等待客户端连接
    new_client_socket, ip_port = tcp_socket_server.accept()

    while True:
        # 6、接受客服端发来的文件名
        recv_data = new_client_socket.recv(1024)
        file_name = recv_data.decode("GBK")
        if len(file_name) == 0:
            break

        # 7、根据文件名读取文件数据
        try:
            with open(file_name, "rb") as file:
                # 8、讲读取的数据发给客户端(循环)
                while True:
                    file_data = file.read(1024)
                    if file_data:
                        new_client_socket.send(file_data)
                    else:
                        break
        except Exception as e:
            print("文件%s下载失败!" % file_name)
        else:
            print("文件%s下载成功" % file_name)

    # 9、关闭和客户端的连接
    new_client_socket.close()

# 10、关闭服务器
# tcp_socket_server.close()

这是另外一个服务端代买(好使)

# 1、导入模块
import socket
# 2、创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置套接字地址可以重用
# tcp_server_socket.setsockopt(当前套接字, 属性名, 属性值)
# socket.SO_REUSEADDR  地址是否可以重用   True可以重用  False 不可以重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3、绑定端口
tcp_server_socket.bind(("", 9090))
# 4、设置监听,设置套接字由主动为被动
tcp_server_socket.listen(128)
# 5、接受客户端连接
while True:
    new_client_socket, ip_port = tcp_server_socket.accept()
    print("欢迎新客户端:", ip_port)
    # 6、接收客户端发送的文件名
    recv_data = new_client_socket.recv(1024)
    file_name = recv_data.decode()
    print(file_name)

    try:
        # 7、根据文件名读取文件内容
        with open(file_name, "rb") as file:
            # 8、把读取的内容发送给客户端(循环)
            while True:
                file_data = file.read(1024)
                # 判断是否读取到了文件的末尾
                if file_data:
                    # 发送文件
                    new_client_socket.send(file_data)
                else:
                    break
    except Exception as e:
        print("文件%s下载失败!" % file_name)
    else:
        print("文件%s下载成功" % file_name)
    # 9、关闭和当前客户端的连接
    new_client_socket.close()
# 10、关闭服务器
# tcp_server_socket.close()

 

 这是客户端的代码

# 1、导入模块
import socket

# 2、创建套接字
tcp_socket_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 3、建立服务器与客户端的连接
while True:
    server_ip = input("请输入服务器的ip地址:")
    if len(server_ip) == 0:
        server_ip = "192.168.220.129"
    try:
        while True:
            server_port = input("请输入服务器的端口号地址:")
            if len(server_port) == 0:
                server_port = 9090
                break
            try:
                server_port = int(server_port)
                if server_port > 65535 or server_port < 0:
                    print("请输入1024-65535间的整数。")
                    continue
                else:
                    break
            except ValueError:
                print("请输入1024-65535间的整数。")

        break
    except socket.gaierror:
        print("请输入正确的网址或者IP地址。")
tcp_socket_client.connect((server_ip, server_port))
print("已连接到服务器。请输入要下载的文件名。\n")

while True:
    # 4、接受用户输入的文件名
    file_name = input("需要下载的文件名:\n")
    if len(file_name) == 0:
        break

    # 5、将文件名发送到服务器端
    tcp_socket_client.send(file_name.encode("GBK"))

    # 6、接受服务器发送的内容并保存
    # 注意字符串中包含转义字符的时候可以在字符串前加r来满足pep8
    with open(r"D:\install\\" + file_name, "wb") as file:
        while True:
            file_data = tcp_socket_client.recv(1024)
            # 判断数据是否传送完毕
            if file_data:
                file.write(file_data)
                print(file_data)
            else:
                break
    print("文件下载完成!")

# 7、关闭套接字
tcp_socket_client.close()

 

上头是我的代码块,利用客户端连接之后客户端每次接受文件都会卡住,有的时候可以接收到,有的时候就一直卡着,当把第二个while删除的时候就接受的飞快了= =,有没有人懂为什么啊。

以下是两个不同服务器代码的运行结果(同一个客户端)

 

因为在等连接

是不是你没退出循环

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y