如何使用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实现简单ftp客户端的方法
Jun 28 Python
Python随机生成手机号、数字的方法详解
Jul 21 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
一份python入门应该看的学习资料
Apr 11 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
Python Image模块基本图像处理操作小结
Apr 13 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
利用Python小工具实现3秒钟将视频转换为音频
Oct 29 Python
Python操作多维数组输出和矩阵运算示例
Nov 28 Python
python和opencv构建运动检测器的实现
Mar 03 Python
使用Djongo模块在Django中使用MongoDB数据库
Jun 20 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
解决laravel session失效的问题
2019/10/14 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
Angular数据绑定机制原理
2018/04/17 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
javascript实现画板功能
2020/04/12 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
python3 爬取图片的实例代码
2018/11/06 Python
python基于event实现线程间通信控制
2020/01/13 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
在keras中实现查看其训练loss值
2020/06/16 Python
党校自我鉴定范文
2013/10/02 职场文书
最新大学职业规划书范文
2013/12/30 职场文书
禁烟标语大全
2014/06/11 职场文书
新闻学专业求职信
2014/07/28 职场文书
国土资源局开展党的群众路线教育实践活动整改措施
2014/09/26 职场文书
特此通知格式
2015/04/27 职场文书
休学证明范本
2015/06/19 职场文书
运动会800米赞词
2015/07/22 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers