如何使用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读写文件操作示例程序
Dec 02 Python
python基于multiprocessing的多进程创建方法
Jun 04 Python
基于数据归一化以及Python实现方式
Jul 11 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
python3中的eval和exec的区别与联系
Oct 10 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 Python
安装Anaconda3及使用Jupyter的方法
Oct 27 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
python实现ROA算子边缘检测算法
Apr 05 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
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
ASP Json Parser修正版
2009/12/06 Javascript
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
js的Boolean对象初始值示例
2014/03/04 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
vue+elementUI实现简单日历功能
2020/09/24 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
python3实现随机数
2018/06/25 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
Python字典底层实现原理详解
2019/12/18 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
python调用win32接口进行截图的示例
2020/11/11 Python
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
社会实践评语
2014/04/28 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
Spring Boot 整合 Apache Dubbo的示例代码
2021/07/04 Java/Android
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL
python基础之//、/与%的区别详解
2022/06/10 Python