如何使用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批量导出导入MySQL用户的方法
Nov 15 Python
Python smallseg分词用法实例分析
May 28 Python
Python中datetime常用时间处理方法
Jun 15 Python
Python 中 list 的各项操作技巧
Apr 13 Python
python中将\\uxxxx转换为Unicode字符串的方法
Sep 06 Python
详解Django-auth-ldap 配置方法
Dec 10 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
Python实现最常见加密方式详解
Jul 13 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
Python 线程池用法简单示例
Oct 02 Python
python获取天气接口给指定微信好友发天气预报
Dec 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中文汉字验证码
2007/04/08 PHP
php 表单验证实现代码
2009/03/10 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
[36:02]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第一局
2016/02/28 DOTA
Python中的ConfigParser模块使用详解
2015/05/04 Python
python3.5使用tkinter制作记事本
2016/06/20 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
python3使用GUI统计代码量
2019/09/18 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
Python matplotlib可视化实例解析
2020/06/01 Python
用 python 进行微信好友信息分析
2020/11/28 Python
详解java调用python的几种用法(看这篇就够了)
2020/12/10 Python
移动端rem布局的两种实现方法
2018/01/03 HTML / CSS
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
八年级生物教学反思
2014/01/22 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
个人存款证明书
2014/10/18 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis