• python使用tcp实现一个简单的下载器


    上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识。

    文件下载器的流程如下:

    客户端:

    1. 输入目标服务器的ip和port
    2. 输入要下载文件的名称
    3. 从服务器下载文件保存到本地

    服务器端 :

    1. 接收客户端要下载的文件名称
    2. 从本地的文件中找到该文件
    3. 将文件的内容传输给客户端

    文件下载客户端

    示例代码如下:

    import socket
    
    
    def main():
            # 创建套接字
            tcp_socket_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        
            # 链接的服务器信息
            server_ip = input("请输入服务器ip:")
            server_port = int(input("请输入服务器port:"))
        
            # 连接服务器
            tcp_socket_client.connect((server_ip, server_port))
        
            # 输入下载的文件名称
            file_name = input("请输入要下载的文件名:")
    
            # 向服务器发送文件名
            tcp_socket_client.send(file_name.encode("utf-8"))
    
            # 接收服务器的文件内容
            # 最大大小为1K
            recv_data = tcp_socket_client.recv(1024)
        
            # 写入接收到的数据
            # 接收到数据时才写入数据
            if recv_data:
                    with open("[new]" + file_name, 'wb') as f:
                            f.write(recv_data)
        
            tcp_socket_client.close()
    
    if __name__ == '__main__':
            main()
    
    

    文件下载服务器端

    示例代码如下:

    import socket
    
    
    def read_file_content(file_name):
            """读取文件内容"""
    
            try:
                    with open(file_name, "rb") as f:
                            content = f.read()
                    return content
            except:
                    print("要下载的文件不存在:%s" % file_name)
    
    
    def main():
            # 创建套接字
            tcp_socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
            # 绑定端口
            local_addr = ("", 8900)
            tcp_socket_server.bind(local_addr)
    
            # 将主动套接字改为被动套接字
            tcp_socket_server.listen(128)
    
            while True:
    
                    client_socket, client_addr = tcp_socket_server.accept()
                    print("新的客户端链接了:%s" % str(client_addr))
    
                    # 接收数据
                    recv_data = client_socket.recv(1024)
                    file_name = recv_data.decode("utf-8")
    
                    print("客户端请求下载的文件是:%s" % file_name)
    
                    file_content = read_file_content(file_name)
    
                    if file_content:
                            client_socket.send(file_content)
    
                    # 关闭客户端套接字
                    client_socket.close()
    
            # 关闭
            tcp_socket_server.close()
    
    
    if __name__ == '__main__':
            main()
    
    

    操作流程

    1. 启动服务器端

      $ python3 downloader-server.py
      
    2. 启动客户端,并输入服务器端的信息已经要下载的文件

      $ ptrhon3 downloader-client.py
      请输入服务器ip:192.168.92.130
      请输入服务器port:8900
      请输入要下载的文件名:test.txt
      
    3. 客户端在当前目录下有一个[new]test.txt的文件表示下载成功

  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/zhangfengxian/p/python-tcp-downloader.html
Copyright © 2020-2023  润新知