如何使用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实现抓取页面上链接的简单爬虫分享
Jan 21 Python
python解决Fedora解压zip时中文乱码的方法
Sep 18 Python
python 换位密码算法的实例详解
Jul 19 Python
Python基于动态规划算法解决01背包问题实例
Dec 06 Python
python线程池threadpool实现篇
Apr 27 Python
Python for循环生成列表的实例
Jun 15 Python
利用Django模版生成树状结构实例代码
May 19 Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 Python
Python request使用方法及问题总结
Apr 26 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
Django admin组件的使用
Oct 24 Python
Python requests用法和django后台处理详解
Mar 19 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/12/25 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
js中实现多态采用和继承类似的方法
2014/08/22 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
浅析node.js中close事件
2014/11/26 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
Python生成密码库功能示例
2017/05/23 Python
wxpython实现图书管理系统
2018/03/12 Python
python生成lmdb格式的文件实例
2018/11/08 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
2014年高一班主任工作总结
2014/12/05 职场文书
干部年终考核评语
2015/01/04 职场文书
龙猫观后感
2015/06/09 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
Python制作一个随机抽奖小工具的实现
2021/07/07 Python
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
Redis入门基础常用操作命令整理
2022/06/01 Redis