如何使用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对html代码进行escape编码的方法
May 04 Python
Python虚拟环境Virtualenv使用教程
May 18 Python
Python字符串逐字符或逐词反转方法
May 21 Python
基于python实现微信模板消息
Dec 21 Python
python实现随机梯度下降法
Mar 24 Python
Python并发:多线程与多进程的详解
Jan 24 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
python+selenium实现12306模拟登录的步骤
Jan 21 Python
python实现进度条的多种实现
Apr 29 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获取字符串的编码格式的方法(函数)
2013/06/21 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
[01:03:51]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第三场
2018/04/09 DOTA
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Python实现ATM系统
2020/02/17 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
linux面试相关问题
2012/08/11 面试题
信息系统专业个人求职信范文
2013/12/07 职场文书
对孩子的寄语
2014/04/09 职场文书
安全责任协议书
2014/04/21 职场文书
小摄影师教学反思
2014/04/27 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
叶问观后感
2015/06/15 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
SpringBoot集成Redis,并自定义对象序列化操作
2021/06/22 Java/Android