用python socket模块实现简单的文件下载
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模块实现简单的文件下载的更多相关文章
- python socket 实现的简单http服务器
预备知识: 关于http 协议的基础请参考这里. 关于socket 基础函数请参考这里. 关于python 网络编程基础请参考这里. 一.python socket 实现的简单http服务器 废话 ...
- python——socket模块与列表映射
从socket模块学习中的一段奇怪代码说起 前言:在学习python标准库中的Socket模块中,发现了一段奇怪的代码. import socket def get_constants(prefix) ...
- Python Logging模块的简单使用
前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...
- python socket编程 实现简单p2p聊天程序
目标是写一个python的p2p聊天的项目,这里先说一下python socket的基础课程 一.Python Socket 基础课程 Socket就是套接字,作为BSD UNIX的进程通信机制,取后 ...
- 项目: 基于Python socket模块实现的简单 ftp 项目:
需要 自己创建一个 info 文件 用来存储用户信息 服务器: import socket import pickle import struct import os import time ''.s ...
- python - socket模块1
1.使用生活中的接打电话,解释socket通信流程 2.根据上图,写出socket通信的伪代码 2.1.server端伪代码 #买手机 #买手机卡 #开机 #等待电话 #收消息 #发消息 #挂电 ...
- Python第三方模块--requests简单使用
1.requests简介 requests是什么?python语言编写的,基于urllib的第三方模块 与urllib有什么关系?urllib是python的内置模块,比urllib更加简洁和方便使用 ...
- python --- socket模块详解
socket常用功能函数: socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) ...
- python optparse模块的简单用法
# coding = utf-8 from optparse import OptionParser from optparse import OptionGroup usage = 'Usage: ...
随机推荐
- Book Review 《构建之法》-2
-敏捷流程包括了几大原则:Backlog.burn-down.Sprint.Scrum. 敏捷开发注重个人之间的交流,提倡尽早的交付有价值的软件满足顾客的需求, 在开发过程中不断与客户进行交互,变化. ...
- 完善好的web项目(校园包车)
- Android : Error inflating class android.support.design.widget.NavigationView
之前一直没搞定的,今天终于解决了. Android报错: android.view.InflateException: Error inflating class android.support. ...
- 蜗牛慢慢爬 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. ...
- C++ STL 整理
一.一般介绍 STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Library ...
- 【BZOJ1044】[HAOI2008]木棍分割(动态规划,贪心)
[BZOJ1044][HAOI2008]木棍分割(动态规划,贪心) 题面 BZOJ 洛谷 题解 第一问随便二分一下就好了,贪心\(check\)正确性显然. 第二问随便前缀和+单调队列优化一下\(dp ...
- 【BZOJ4260】Codechef REBXOR (Trie树)
[BZOJ4260]Codechef REBXOR (Trie树) 题面 BZOJ 题解 两眼题.第一眼不会做,第二眼好简单... 前缀异或和一下,拿\(Trie\)树维护求一个在这个端点以左的最大值 ...
- 函数、可变参数、keyword-only参数、实参解构
函数的数学定义:y=f(x) ,y是x的函数,x是自变量.y=f(x0, x1, ..., xn) python中的函数: 由函数名称.参数列表.和若干语句组成的语句块构成,完成一定的功能,是组织代码 ...
- (转)面向对象——UML类图设计
背景:一直以来,对UMl类图的画法不甚理解,但是随着学习的深入,发现熟练掌握UML类图,能够更好理解代码间的逻辑性,而这也是程序设计的基础所在,所以很有必要把UML好好掌握. UML类图新手入门级介绍 ...
- hdu 1789 Doing HomeWork Again (贪心算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 /*Doing Homework again Time Limit: 1000/1000 MS ...