如何使用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 THREADING模块中的JOIN()方法深入理解
Feb 18 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
Python3实现并发检验代理池地址的方法
Sep 18 Python
python 动态加载的实现方法
Dec 22 Python
python3去掉string中的标点符号方法
Jan 22 Python
用Python逐行分析文件方法
Jan 28 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
python如何删除文件中重复的字段
Jul 16 Python
win10环境下配置vscode python开发环境的教程详解
Oct 16 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
Sep 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
PR值查询 | PageRank 查询
2006/12/20 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
treepanel动态加载数据实现代码
2012/12/15 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
python中异常捕获方法详解
2017/03/03 Python
Python使用functools实现注解同步方法
2018/02/06 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
趣味运动会活动方案
2014/02/12 职场文书
会计系毕业求职信
2014/08/07 职场文书
在职员工证明书
2014/09/19 职场文书
公司开会通知
2015/04/20 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
行政处罚告知书
2015/07/01 职场文书
导游词之张家界
2019/10/31 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL
python标准库ElementTree处理xml
2022/05/20 Python