server端:

  1. # ftp server端
  2. import socket, os, time
  3.  
  4. server = socket.socket()
  5. server.bind(("localhost", 8080))
  6. server.listen()
  7. while True:
  8. conn, addr = server.accept()
  9. print("连接到客户端:", addr)
  10. while True:
  11. try: # windows会直接报错,需要捕获异常
  12. data = conn.recv(1024)
  13. if not data:
  14. print("客户端已断开")
  15. break
  16. except Exception as e:
  17. print("客户端已经断开")
  18. break
  19. cmd, filename = data.decode().split() # ex: get name.txt
  20. if os.path.isfile(filename):
  21. f = open(filename, "rb")
  22. # 获取文件的字节大小
  23. size = os.stat(filename).st_size
  24. conn.send(str(size).encode()) # 发送文件大小
  25. conn.recv(1024)
  26. for line in f: # 客户端确认后发送文件内容
  27. conn.send(line)
  28. f.close()
  29. print("文件下载完成")
  30. conn.send("not file".encode())
  31. server.close()

  

client端:

  1. import socket
  2.  
  3. client = socket.socket()
  4. client.connect(("localhost", 8080))
  5. while True:
  6. cmd = input(">>:").strip()
  7. if len(cmd)==0: continue
  8. if cmd.startswith("get"):
  9. client.send(cmd.encode()) # 发送请求
  10. server_response = client.recv(1024)
  11. if server_response.decode().startswith("not"):
  12. print("请输入有效文件名")
  13. continue
  14. client.send(b"ready to recv file") # 发送确认
  15. file_size = int(server_response.decode()) # 获取文件大小
  16. rece_size=0
  17. filename = cmd.split()[1]
  18. f = open(filename + ".new", "wb")
  19. while rece_size < file_size:
  20. if file_size - rece_size > 1024: # 要收不止一次
  21. size = 1024
  22. else: # 最后一次了,剩多少收多少,防止之后发送数据粘包
  23. size = file_size - rece_size
  24. print("last receive:", size)
  25. recv_data = client.recv(size)
  26. rece_size += len(recv_data) # 累加接受数据大小
  27. f.write(recv_data) # 写入文件,即下载
  28. else:
  29. print("文件下载完成")
  30. f.close()
  31. client.close()

  

测试案例:

主要是socket的简单使用,主要节点都有注释

用python socket模块实现简单的文件下载的更多相关文章

  1. python socket 实现的简单http服务器

    预备知识: 关于http 协议的基础请参考这里. 关于socket 基础函数请参考这里. 关于python 网络编程基础请参考这里. 一.python socket 实现的简单http服务器   废话 ...

  2. python——socket模块与列表映射

    从socket模块学习中的一段奇怪代码说起 前言:在学习python标准库中的Socket模块中,发现了一段奇怪的代码. import socket def get_constants(prefix) ...

  3. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  4. python socket编程 实现简单p2p聊天程序

    目标是写一个python的p2p聊天的项目,这里先说一下python socket的基础课程 一.Python Socket 基础课程 Socket就是套接字,作为BSD UNIX的进程通信机制,取后 ...

  5. 项目: 基于Python socket模块实现的简单 ftp 项目:

    需要 自己创建一个 info 文件 用来存储用户信息 服务器: import socket import pickle import struct import os import time ''.s ...

  6. python - socket模块1

    1.使用生活中的接打电话,解释socket通信流程  2.根据上图,写出socket通信的伪代码 2.1.server端伪代码 #买手机   #买手机卡 #开机 #等待电话 #收消息 #发消息 #挂电 ...

  7. Python第三方模块--requests简单使用

    1.requests简介 requests是什么?python语言编写的,基于urllib的第三方模块 与urllib有什么关系?urllib是python的内置模块,比urllib更加简洁和方便使用 ...

  8. python --- socket模块详解

    socket常用功能函数: socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)                  ...

  9. python optparse模块的简单用法

    # coding = utf-8 from optparse import OptionParser from optparse import OptionGroup usage = 'Usage: ...

随机推荐

  1. Book Review 《构建之法》-2

    -敏捷流程包括了几大原则:Backlog.burn-down.Sprint.Scrum. 敏捷开发注重个人之间的交流,提倡尽早的交付有价值的软件满足顾客的需求, 在开发过程中不断与客户进行交互,变化. ...

  2. 完善好的web项目(校园包车)

  3. Android : Error inflating class android.support.design.widget.NavigationView

      之前一直没搞定的,今天终于解决了. Android报错: android.view.InflateException: Error inflating class android.support. ...

  4. 蜗牛慢慢爬 LeetCode 25. Reverse Nodes in k-Group [Difficulty: Hard]

    题目 Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...

  5. C++ STL 整理

    一.一般介绍 STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Library ...

  6. 【BZOJ1044】[HAOI2008]木棍分割(动态规划,贪心)

    [BZOJ1044][HAOI2008]木棍分割(动态规划,贪心) 题面 BZOJ 洛谷 题解 第一问随便二分一下就好了,贪心\(check\)正确性显然. 第二问随便前缀和+单调队列优化一下\(dp ...

  7. 【BZOJ4260】Codechef REBXOR (Trie树)

    [BZOJ4260]Codechef REBXOR (Trie树) 题面 BZOJ 题解 两眼题.第一眼不会做,第二眼好简单... 前缀异或和一下,拿\(Trie\)树维护求一个在这个端点以左的最大值 ...

  8. 函数、可变参数、keyword-only参数、实参解构

    函数的数学定义:y=f(x) ,y是x的函数,x是自变量.y=f(x0, x1, ..., xn) python中的函数: 由函数名称.参数列表.和若干语句组成的语句块构成,完成一定的功能,是组织代码 ...

  9. (转)面向对象——UML类图设计

    背景:一直以来,对UMl类图的画法不甚理解,但是随着学习的深入,发现熟练掌握UML类图,能够更好理解代码间的逻辑性,而这也是程序设计的基础所在,所以很有必要把UML好好掌握. UML类图新手入门级介绍 ...

  10. hdu 1789 Doing HomeWork Again (贪心算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 /*Doing Homework again Time Limit: 1000/1000 MS ...