如何使用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 19 Python
Python书单 不将就
Jul 11 Python
Python中列表list以及list与数组array的相互转换实现方法
Sep 22 Python
Python实现通过继承覆盖方法示例
Jul 02 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 Python
python 实现矩阵按对角线打印
Nov 29 Python
python绘制彩虹图
Dec 16 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
python实现简单的五子棋游戏
Sep 01 Python
python中的插入排序的简单用法
Jan 19 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 Python
Python 数据可视化神器Pyecharts绘制图像练习
Feb 28 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实现查询手机归属地的方法详解
2017/04/28 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
简单的js分页脚本
2009/05/21 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
对js关键字命名的疑问介绍
2014/04/25 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
python实现扫描日志关键字的示例
2018/04/28 Python
python和opencv实现抠图
2018/07/18 Python
python使用Matplotlib画条形图
2020/03/25 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
python 如何实现遗传算法
2020/09/22 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
大学校庆邀请函
2014/01/11 职场文书
小学生开学感言
2014/02/28 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
学籍证明模板
2014/11/21 职场文书
鼋头渚导游词
2015/02/05 职场文书
党小组考察意见
2015/06/02 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python