FXHao

个人站

欢迎来到我的小世界~哈哈哈~


TCP-模拟文件下载

TCP 之文件下载

客户端(client)

import socket


def main():
    # 1.创建套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2.获取服务器的 IP、port
    dest_ip = input("请输入下载服务的IP:")
    dest_port = int(input("请输入下载服务器的port:"))

    # 3.链接服务器
    tcp_socket.connect((dest_ip, dest_port))

    # 4.获取下载的文件名字
    download_file_name = input("请输入要下载文件的名字:")

    # 5.将文件名字发送到服务器
    tcp_socket.send(download_file_name.encode("gbk"))

    # 6.接受文件中的数据
    recv_data = tcp_socket.recv(1024*1024)
    
    if recv_data:   # 如果有数据才执行下面操作,不然就算没数据也会建一个文件
        # 7.保存就收到的数据到一个文件中
        with open("[文件]" + download_file_name, "wb") as f:
            f.write(recv_data)

    # 8.关闭套接字
    tcp_socket.close()


if __name__ == '__main__':
    main()

服务器(server)

import socket


def sen_file_2_client(new_client_socket, client_addr):
    # 1.接受客户端发送过来要下载的文件名
    file_name = new_client_socket.recv(1024)
    print("客户端(%s)要下载的文件是:%s" % (str(client_addr), file_name.decode("gbk")))

    file_content = None
    # 2.打开这个文件,读取数据
    try:
        f = open(file_name, "rb")
        file_content = f.read()
        f.close()

    except Exception:
        print("没有要下载的文件(%s)" % file_name.decode("gbk"))

    # 3.发送问价的数据给客户端
    if file_content:
        new_client_socket.send(file_content)


def main():
    # 1.创建套接字 socket(买个手机)
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2.绑定本地信息 bind(插入手机卡)
    tcp_server.bind(("", 7890))

    # 3.让默认的套接字由主动变为被动 listen(将手机设置为正常的 响铃模式)
    tcp_server.listen(128)

    while True:
        # 4.等待客户端的链接 accept(等待别人的电话)
        print("等待客户链接.....")
        new_client_socket, client_addr = tcp_server.accept()
        print("收到%s链接" % str(client_addr))

        # 5.调用发送文件函数,完成为客户端服务
        sen_file_2_client(new_client_socket, client_addr)

        # 6.关闭套接字
        new_client_socket.close()

    tcp_server.close()  # 这句因为上面的死循环,不会执行到这句,也可以价格判断让循环中断


if __name__ == '__main__':
    main()