zoukankan      html  css  js  c++  java
  • 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的文件表示下载成功

  • 相关阅读:
    http的url长度限制
    windows xp unlock 很慢
    C++的vector::push_back()和vector::resize()比较
    手机开发的7种机型列表
    DELPHI中对NT服务型程序的控制单元
    ICON图标下载地址汇总
    Solving the 'cannot find drf file' problem when compiling packages.
    Delphi常用属性和事件
    免费delphi组件收集
    Delphi中关于Canvas.TextOut
  • 原文地址:https://www.cnblogs.com/zhangfengxian/p/python-tcp-downloader.html
Copyright © 2011-2022 走看看