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

python基础

浏览数:108

2019-3-20

上一篇中介绍了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的文件表示下载成功