如何使用python socket模块实现简单的文件下载

 更新时间:2020年09月04日 10:20:11   作者:侯赛雷  
这篇文章主要介绍了如何使用python socket模块实现简单的文件下载,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下

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实现方便使用的级联进度信息实例

    Python实现方便使用的级联进度信息实例

    这篇文章主要介绍了Python实现方便使用的级联进度信息,实例分析了Python显示级联进度信息的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • Python中MySQL数据迁移到MongoDB脚本的方法

    Python中MySQL数据迁移到MongoDB脚本的方法

    MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。本文给大家介绍Python中MySQL数据迁移到MongoDB脚本的方法,需要的朋友参考下
    2016-04-04
  • Python-typing: 类型标注与支持 Any类型详解

    Python-typing: 类型标注与支持 Any类型详解

    这篇文章主要介绍了Python-typing: 类型标注与支持 Any类型详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 解决Mac下首次安装pycharm无project interpreter的问题

    解决Mac下首次安装pycharm无project interpreter的问题

    今天小编就为大家分享一篇解决Mac下首次安装pycharm无project interpreter的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python自动分箱,计算woe,iv的实例代码

    python自动分箱,计算woe,iv的实例代码

    今天小编就为大家分享一篇python自动分箱,计算woe,iv的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python函数中将变量名转换成字符串实例

    python函数中将变量名转换成字符串实例

    这篇文章主要介绍了python函数中将变量名转换成字符串实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 从请求到响应过程中django都做了哪些处理

    从请求到响应过程中django都做了哪些处理

    这篇文章主要给大家介绍了关于从请求到响应过程中django都做了哪些处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • 深入理解Python中的super()方法

    深入理解Python中的super()方法

    super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。这篇文章主要给大家介绍了关于Python中super()方法的相关资料,需要的朋友可以参考下。
    2017-11-11
  • pytest配置文件pytest.ini的详细使用

    pytest配置文件pytest.ini的详细使用

    这篇文章主要介绍了pytest配置文件pytest.ini的详细使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • python中的随机函数小结

    python中的随机函数小结

    这篇文章主要介绍了python中的随机函数小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01

最新评论