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()

  

测试案例:

主要是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. Beta版本冲刺(六)

    目录 组员情况 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团队签入记 ...

  2. 共享服务Samba,实现liunx与Windows文件共享

    Samba服务程序 是一款SMB协议并有服务器和客户端组成的开源文件共享软件,实现了Linux 与Windows系统之间的文件共享 Samba的配置文件有太多注释的东西,为了方便使用下面的命令,可以更 ...

  3. beta 圆桌 6

    031602111 傅海涛 1.今天进展 接口微调修正 2.存在问题 文档转化太久 3.明天安排 完成全部接口的交互 4.心得体会 文档转化需要好好优化 031602115 黄家雄 1.界面优化 2. ...

  4. JS面向对象编程:对象

    一般面向过程的写法都是写很多function,坏处:1.代码复用不好 2.函数名称容易重复冲突 下面介绍面向对象的写法: 在JS中每个函数function都是一个对象. 比如,下面这个就是一个对象,我 ...

  5. Docker(十七)-修改Docker容器启动配置参数

    有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker c ...

  6. OneZero第四周——预完成功能点统计

    本周OneZero将完成“统计”功能. 功能点统计如下: 1.主页单击记录,进入修改界面,修改记录. 2.主页长按记录,出现删除按钮,删除记录. 3.全部记录按分类进行饼图显示. 4.全部记录按分类进 ...

  7. 一本通1632【 例 2】[NOIP2012]同余方程

    1632:[ 例 2][NOIP2012]同余方程 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 求关于 x 的同余方程 ax≡1(mod b) 的最小正整 ...

  8. 首先java中集合类主要有两大分支

    本文仅分析部分原理和集合类的特点,不分析源码,旨在对java的集合类有一个整体的认识,理解各个不同类的关联和区别,让大家在不同的环境下学会选择不同的类来处理. Java中的集合类包含的内容很多而且很重 ...

  9. 在Mac上配置全局的Git忽略文件

    现在同时搞着好几个项目,在Xcode.IDEA.Eclipse之间频繁的切换,每个项目的忽略文件列表都不一样,每个项目都有一个.gitignore,甚是麻烦,今天网上拔出来一个设置全局忽略的办法,记录 ...

  10. SP8093 JZPGYZ - Sevenk Love Oimaster 解题报告

    SP8093 JZPGYZ - Sevenk Love Oimaster 题目大意 给定\(n(n\le 10000)\)个模板串,以及\(m(m\le 60000)\)个查询串(模板串总长\(\le ...