如何使用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 14 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
使用python实现接口的方法
Jul 07 Python
python实现12306抢票及自动邮件发送提醒付款功能
Mar 08 Python
django的ORM模型的实现原理
Mar 04 Python
利用python实现凯撒密码加解密功能
Mar 31 Python
python使用信号量动态更新配置文件的操作
Apr 01 Python
keras导入weights方式
Jun 12 Python
python如何停止递归
Sep 09 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
分享python函数常见关键字
Apr 26 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+javascript模拟Matrix画面
2006/10/09 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
用ADODB.Stream转换
2007/01/22 Javascript
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
jQuery中slidedown与slideup方法用法示例
2016/09/16 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
在Django中同时使用多个配置文件的方法
2015/07/22 Python
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
python3.8下载及安装步骤详解
2020/01/15 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
个人买房协议书范本
2014/10/06 职场文书
2014年食堂工作总结
2014/11/20 职场文书
如何在C++中调用Python
2021/05/21 Python
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python