如何使用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基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 Python
python opencv实现任意角度的透视变换实例代码
Jan 12 Python
python 对key为时间的dict排序方法
Oct 17 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
Dec 05 Python
Python requests模块实例用法
Feb 11 Python
python多进程读图提取特征存npy
May 21 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
Python库安装速度过慢解决方案
Jul 14 Python
python如何变换环境
Jul 21 Python
Python列表推导式实现代码实例
Sep 09 Python
python 破解加密zip文件的密码
Apr 22 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常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
Javascript模板技术
2007/04/27 Javascript
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
2007/11/30 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
VUE+Element实现增删改查的示例源码
2020/11/23 Vue.js
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
python3实现猜数字游戏
2020/12/07 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
银行出纳岗位职责
2013/11/25 职场文书
小区停车场管理制度
2014/01/27 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
家属慰问信
2015/02/14 职场文书
销售辞职信范文
2015/03/02 职场文书
争先创优个人总结
2015/03/04 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript