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

时间:2023-03-09 06:39:06
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的文件表示下载成功