如何使用python socket模块实现简单的文件下载


Posted in Python onSeptember 04, 2020

server端:

# ftp server端
import socket, os, time
 
server = socket.socket()
server.bind(("localhost", 8080))
server.listen()
while True:
  conn, addr = server.accept()
  print("连接到客户端:", addr)
  while True:
    try: # windows会直接报错,需要捕获异常
      data = conn.recv(1024)
      if not data:
        print("客户端已断开")
        break
    except Exception as e:
      print("客户端已经断开")
      break
    cmd, filename = data.decode().split() # ex: get name.txt
    if os.path.isfile(filename):
      f = open(filename, "rb")
      # 获取文件的字节大小
      size = os.stat(filename).st_size
      conn.send(str(size).encode()) # 发送文件大小
      conn.recv(1024)
      for line in f:  # 客户端确认后发送文件内容
        conn.send(line)
      f.close()
      print("文件下载完成")
    conn.send("not file".encode())
server.close()

client端:

import socket
 
client = socket.socket()
client.connect(("localhost", 8080))
while True:
  cmd = input(">>:").strip()
  if len(cmd)==0: continue
  if cmd.startswith("get"):
    client.send(cmd.encode()) # 发送请求
    server_response = client.recv(1024)
    if server_response.decode().startswith("not"):
      print("请输入有效文件名")
      continue
    client.send(b"ready to recv file") # 发送确认
    file_size = int(server_response.decode()) # 获取文件大小
    rece_size=0
    filename = cmd.split()[1]
    f = open(filename + ".new", "wb")
    while rece_size < file_size:
      if file_size - rece_size > 1024: # 要收不止一次
        size = 1024
      else: # 最后一次了,剩多少收多少,防止之后发送数据粘包
        size = file_size - rece_size
        print("last receive:", size)
      recv_data = client.recv(size)
      rece_size += len(recv_data) # 累加接受数据大小
      f.write(recv_data) # 写入文件,即下载
    else:
      print("文件下载完成")
      f.close()
client.close()

测试案例:

如何使用python socket模块实现简单的文件下载

如何使用python socket模块实现简单的文件下载

以上就是如何使用python socket模块实现简单的文件下载的详细内容,更多关于python socket文件下载的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现把utf-8格式的文件转换成gbk格式的文件
Jan 22 Python
Python实现从订阅源下载图片的方法
Mar 11 Python
python字典基本操作实例分析
Jul 11 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 Python
python 开发的三种运行模式详细介绍
Jan 18 Python
对Python发送带header的http请求方法详解
Jan 02 Python
python与字符编码问题
May 24 Python
Python创建临时文件和文件夹
Aug 05 Python
Python Opencv实现单目标检测的示例代码
Sep 08 Python
用python制作个视频下载器
Feb 01 Python
python使用openpyxl库读写Excel表格的方法(增删改查操作)
May 02 Python
pytorch训练神经网络爆内存的解决方案
May 22 Python
python 监控logcat关键字功能
Sep 04 #Python
如何将json数据转换为python数据
Sep 04 #Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
Sep 04 #Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 #Python
学习Python需要哪些工具
Sep 04 #Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 #Python
Python程序慢的重要原因
Sep 04 #Python
You might like
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
Jquery实现纵向横向菜单
2016/01/24 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
vue实现放大镜效果
2020/09/17 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
在Python中使用模块的教程
2015/04/27 Python
使用pdb模块调试Python程序实例
2015/06/02 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
Python爬取网页信息的示例
2020/09/24 Python
python 绘制国旗的示例
2020/09/27 Python
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
运动会闭幕式解说词
2014/02/21 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
任命书格式
2014/06/05 职场文书
离婚财产分配协议书
2014/10/21 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis
Tomcat安装使用及部署Web项目的3种方法汇总
2022/08/14 Servers