Python3使用TCP编写一个简易的文件下载器功能

作者:fighting25 时间:2021-02-20 09:58:07 

利用Python3来实现TCP协议,和UDP类似。UDP应用于及时通信,而TCP协议用来传送文件、命令等操作,因为这些数据不允许丢失,否则会造成文件错误或命令混乱。下面代码就是模拟客户端通过命令行操作服务器。客户端输入命令,服务器执行并且返回结果。

TCP(Transmission Control Protocol 传输控制协议):是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

使用TCP编写一个简易的文件下载器要求:需编写文件下载器服务端和文件下载器客户端

服务器端代码:


import socket
import os
import threading
# 处理客户端请求下载文件的操作(从主线程提出来的代码)
def deal_client_request(ip_port, service_client_socket):
 # 连接成功后,输出“客户端连接成功”和客户端的ip和端口
 print("客户端连接成功", ip_port)
 # 接收客户端的请求信息
 file_name = service_client_socket.recv(1024)
 # 解码
 file_name_data = file_name.decode("utf-8")
 # 判断文件是否存在
 if os.path.exists(file_name_data):
   #输出文件字节数
   fsize = os.path.getsize(file_name_data)
   #转化为兆单位
   fmb = fsize/float(1024*1024)
   #要传输的文件信息
   senddata = "文件名:%s 文件大小:%.2fMB"%(file_name_data,fmb)
   #发送和打印文件信息
   service_client_socket.send(senddata.encode("utf-8"))
   print("请求文件名:%s 文件大小:%.2f MB"%(file_name_data,fmb))
   #接受客户是否需要下载
   options = service_client_socket.recv(1024)
   if options.decode("utf-8") == "y":
     # 打开文件
     with open(file_name_data, "rb") as f:
       #计算总数据包数目
       nums = fsize/1024
       #当前传输的数据包数目
       cnum = 0
       while True:
         file_data = f.read(1024)
         cnum = cnum + 1
         jindu = cnum/nums*100
         print("当前已下载:%.2f%%"%jindu,end = "\r")
         if file_data:
           # 只要读取到数据,就向客户端进行发送
           service_client_socket.send(file_data)
         # 数据读完,退出循环
         else:
           print("请求的文件数据发送完成")
           break
   else:
     print("下载取消!")
 else:
   print("下载的文件不存在!")
 # 关闭服务当前客户端的套接字
 service_client_socket.close()
if __name__ == '__main__':
 # 把工作目录切换到data目录下
 os.chdir("./data")
 # 创建套接字
 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 # 绑定端口号
 tcp_server_socket.bind(("", 3356))
 # 设置监听,将主动套接字变为被动套接字
 tcp_server_socket.listen(128)
 # 循环调用accept,可以支持多个客户端同时连接,和多个客户端同时下载文件
 while True:
   service_client_socket, ip_port = tcp_server_socket.accept()
   # 连接成功后打印套接字号
   #print(id(service_client_socket))
   # 创建子线程
   sub_thread = threading.Thread(target=deal_client_request, args=(ip_port, service_client_socket))
   # 启动子线程
   sub_thread.start()

客户端代码:


# 多任务文件下载器客户端
import socket
if __name__ == '__main__':
 # 创建套接字
 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 # 和服务端连接
 server_ip = input("输入服务器IP:")
 tcp_client_socket.connect((server_ip, 3356))
 # 发送下载文件的请求
 file_name = input("请输入要下载的文件名:")
 # 编码
 file_name_data = file_name.encode("utf-8")
 # 发送文件下载请求数据
 tcp_client_socket.send(file_name_data)
 #接收要下载的文件信息
 file_info = tcp_client_socket.recv(1024)
 # 文件信息解码
 info_decode = file_info.decode("utf-8")
 print(info_decode)
 #获取文件大小
 fileszie = float(info_decode.split(':')[2].split('MB')[0])
 fileszie2 = fileszie*1024
 # 是否下载?输入y确认输入q 取消
 opts = input("是否下载?(y 确认q 取消)")
 if opts == 'q':
   print("下载取消!程序退出")
 else:
   print("正在下载》》》")
   #向服务器确认正在下载
   tcp_client_socket.send(b'y')
   # 把数据写入到文件里
   with open("./" + file_name, "wb") as file:
     #目前接收到的数据包数目
     cnum = 0
     while True:
       # 循环接收文件数据
       file_data = tcp_client_socket.recv(1024)
       # 接收到数据
       if file_data:
         # 写入数据
         file.write(file_data)
         cnum = cnum+1
         jindu =cnum/fileszie2*100
         print("当前已下载:%.2f%%"%jindu,end = "\r")
       # 接收完成
       else:
         print("下载结束!")
         break
 # 关闭套接字
 tcp_client_socket.close()

运行窗口如下:

1)服务器端

Python3使用TCP编写一个简易的文件下载器功能

2)客户端

Python3使用TCP编写一个简易的文件下载器功能

注意:客户端和服务器端不要运行在IDLE中,直接使用终端运行。

总结

以上所述是小编给大家介绍的Python3使用TCP编写一个简易的文件下载器功能,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://www.linuxidc.com/Linux/2019-05/158530.htm

标签:python3,tcp,下载器
0
投稿

猜你喜欢

  • Python autoescape标签用法解析

    2023-03-14 06:36:22
  • 使用Python通过win32 COM实现Word文档的写入与保存方法

    2021-03-16 04:09:27
  • Python可变参数会自动填充前面的默认同名参数实例

    2022-05-24 05:00:43
  • Python字符串三种格式化输出

    2022-12-15 09:47:59
  • ChatGPT教你用Python实现BinarySearchTree详解

    2023-11-18 15:26:18
  • python url 参数修改方法

    2023-09-12 19:02:24
  • 利用setuptools打包python程序的方法步骤

    2023-07-20 08:57:47
  • LRUCache的实现原理及利用python实现的方法

    2022-06-26 06:51:51
  • Python字符串str超详细详解(适合新手!)

    2021-06-26 02:48:00
  • SQLite3中文编码 Python的实现

    2023-02-03 13:21:38
  • Python3操作YAML文件格式方法解析

    2021-05-22 03:57:10
  • 解决pytorch-gpu 安装失败的记录

    2023-04-04 05:44:44
  • Python上下文管理器和with块详解

    2021-01-15 21:30:27
  • 举例区分Python中的浅复制与深复制

    2022-08-20 02:34:57
  • 提升Python运行速度的5个小技巧

    2021-07-28 20:25:24
  • tensorflow实现对图片的读取的示例代码

    2023-07-20 06:07:30
  • CTF中的PHP特性函数解析之中篇

    2023-06-11 12:56:20
  • Python实现学生成绩管理系统

    2023-08-13 09:51:17
  • Python无头爬虫下载文件的实现

    2023-11-30 03:24:00
  • python实时获取外部程序输出结果的方法

    2023-04-27 02:29:04
  • asp之家 网络编程 m.aspxhome.com