当前位置: Python基础教程 > 14-网络编程-tcp > 阅读正文

python的tcp文件下载

2021.7.4.   379 次   1616字

本节演示简单的tcp文件下载案例

tcp服务器代码

读取客户端要下载的文件名, 打开该文件, 发送字节

import socket

def send_file_client(new_client_socket, client_addr):
    # 1.获取客户端要下载的文件名
    file_name = new_client_socket.recv(1024).decode("utf-8")
    print("客户端"+str(client_addr)+"要下载的文件是"+file_name)

    # 2.读取文件
    file_content = None
    try:
        f = open(file_name, "rb")
        file_content = f.read()
        f.close()
    except Exception as ret:
        print("要下载的文件'"+file_name+"'不存在")

    # 3.发送文件给客户端
    if file_content:
        new_client_socket.send(file_content)

def main():
    # 1.创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.绑定本地信息
    tcp_server_socket.bind(("", 8888))
    # 3.设置被被动模式
    tcp_server_socket.listen(128)
    # 循环为客户端服务
    while True:
        # 4.等待客户端连接
        new_client_socket, client_addr = tcp_server_socket.accept()
        # 5.调用发送文件函数, 完成对客户端服务
        send_file_client(new_client_socket, client_addr)
        # 6.关闭套接字
        new_client_socket.close()
    tcp_server_socket.close()

if __name__=="__main__":
    main()

客户端代码

发送要下载的文件名

import socket

def main():
    # 1.创建套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.输入服务器信息
    dest_ip = input("请输入服务器ip:")
    dest_port = int(input("请输入服务器端口:"))
    # 3.连接服务器
    tcp_socket.connect((dest_ip, dest_port))
    # 4.输入要下载文件名
    download_name = input("请输入要下载的文件:")
    # 5.发送文件名给服务器
    tcp_socket.send(download_name.encode("utf-8"))
    # 6.从服务器接收文件, 要判断是否为空
    rec_data = tcp_socket.recv(1024)
    if rec_data:
        # 7.保存数据到文件中
        with open("下载"+download_name, "wb") as f:
            f.write(rec_data)
    # 8.关闭套接字
    tcp_socket.close()

if __name__=="__main__":
    main()

在python中, with open(xxx) 是文件操作异常的自动close, 而as是起一个别名

网络编程除了udp, tcp, 其实还有其他方式, 但没这么常用, 在网络安全课程中会接触到。

此外, tcp_server_socket.listen(128)表示最大同时监听128个客户端, 而每个操作系统对此语句的实现并不相同( 能同时服务多少个客户端, 与操作系统能力有关 )

tcp是面向连接的, 但并不是一对一, 而是多对一, 一个服务器可以同时服务多个客户端, 但我们所学习到的都只能同时服务单个客户端, 要同时服务多个客户端, 必须使用学习多任务, 我们后续学习的http协议, 也往往是基于多任务的。

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群