Python socket实现ftp文件下载服务
简要
使用Python socket和多线程实现一个FTP服务下载。下面的示例是固定下载某一个任意格式文件。
仅仅为了展示如果使用socket和多线程进行文件下载
服务端代码
import socket
import threading
import os
# file = r"D:\var\log\abc.log"
file = r"D:\var\log\rabbitmq-server-3.7.2.exe"
def one_socket_thread(conn:socket.socket, addr):
"""
每次有一个连接,就启动一个线程进行处理
:param conn:
:return:
"""
byte_size_per_time = 1024*1024
index = 0
# 首先要告诉客户端,文件的大小
conn.recv(byte_size_per_time)
conn.send(str(os.path.getsize(file)).encode("utf-8"))
with open(file, "rb") as fh:
while True: # 一直在一个socket连接以内
socket_raw_receive = conn.recv(byte_size_per_time) # 从socket客户端接收数据
if not socket_raw_receive: # 如果从socket连接的客户端接收不到数据的话,就结束
break
fh.seek(index) # 跳到指定索引位置
content = fh.read(byte_size_per_time)
conn.send(content) # 往socket客户端发送数据
index += byte_size_per_time
print("[{}] has completed and close socket".format(addr))
conn.close()
def main():
ip_port = ("127.0.0.1", 9000)
sk_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk_server.bind(ip_port)
sk_server.listen(5) # 最多有5个连接
print("Waiting for connection ...")
while True:
conn, addr = sk_server.accept()
threading.Thread(target=one_socket_thread, args=(conn, addr)).start()
if __name__ == '__main__':
main()
客户端代码
import socket file = r"D:\var\log\rabbitmq-server-3.7.2.copy.exe" def download():
ip_port = ("127.0.0.1", 9000)
byte_size_per_time = 102
sk_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk_client.connect(ip_port) # 首先获取到文件的大小
sk_client.send(b"OK")
source_file_size = int(sk_client.recv(1024).decode("utf-8")) total_download_size = 0 # 记录总共下载了多少数据
with open(file, "wb") as fh:
while True:
sk_client.send(b"OK") # 如果文件没有下载完的话,客户端给服务端发送这个消息,接着下载
content = sk_client.recv(byte_size_per_time)
fh.write(content)
total_download_size += len(content)
if total_download_size == source_file_size: # 说明此时已经是最后一笔数据了,马上就下载完
sk_client.send(b"")
break
print("File [{}] has downloaded successfully".format(file))
sk_client.close() if __name__ == '__main__':
download()
Python socket实现ftp文件下载服务的更多相关文章
- Python socket编程客户端与服务端通信
[本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...
- python socket 客服端服务端编程
客服端编程 import socket try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error a ...
- [原创]python之socket-ftp
今天来讲讲ftp文件下载,感觉挺有趣的,知道吧,就那种看到新文件生成,而自己写的代码也不多,那种成就感! 一.需求: 客户端发送指令给服务端,服务端根据指令找到相应文件,发送给客户端 分析: PS:e ...
- Python开发【Tornado】:搭建文件下载服务、音频文件播放
Tornado 如何做文件下载 要求:浏览器输入url地址,直接弹窗提示下载 Tornado服务端,搭建文件下载服务 #!/usr/bin/env python # -*- coding:utf-8 ...
- C#本地文件下载以及FTP文件服务下载(以Pdf文件为例)
一.C#实现本地文件下载 1.文件下载的路径 文件名称 以及文件下载之后要放的位置 这三个变量是必须要的 2.定义以下四个对象: FileWebRequest ftpWebRequest = nu ...
- 25 python socket网络编程
一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...
- socket实现ftp上传下载
socket实现ftp文件的上传和下载 server端代码: import socket import json import struct import os soc = socket.socket ...
- day34 异常处理、断言、socket之ftp协议
Python之路,Day20 = 异常处理.断言.socket之ftp协议 参考博客:http://www.cnblogs.com/metianzing/articles/7148191.html 异 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
随机推荐
- 从零玩转系列之微信支付实战PC端接口搭建
一.前言 halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布 ...
- 10分钟讲清int 和 Integer 的区别
其实在Java编程中,int和Integer都是非常常用的数据类型,但它们之间存在一些关键的区别,特别是在面向对象编程中.所以接下来,就让我们一起来探讨下关于int和Integer的区别这个问题吧. ...
- Kubernetes(k8s) Web-UI界面(二):部署和访问Kuboard
目录 一.系统环境 二.前言 三.Kuboard简介 四.部署Kuboard 五.访问kuboard 六.总结 七.附加信息 一.系统环境 本文主要基于Kubernetes1.21.9和Linux操作 ...
- AcWing 4490. 染色题解
题目描述 样例 输入: 6 1 2 2 1 5 2 1 1 1 1 1 输出 3 算法描述 思路 我们以样例为例讲讲思路. 如何确保dfs能顺利便利呢,我们可以使用链式前向星来存图(树) C++代码 ...
- 【Git】常用命令汇总
一.仓库管理 git init:本地初始化 git clone:克隆远程仓库 git remote:远程仓库管理 git remote:查看远程仓库的信息 git remote -v:显示更详细的信息 ...
- 图像处理_Retinex图像增强
单尺度SSR (Single Scale Retinex) 图像 S ( x , y ) S(x,y) S(x,y)分解为两个不同的图像:反射图像 R ( x , y ) R(x,y) R(x,y), ...
- 常用语言的线程模型(Java、go、C++、python3)
背景知识 软件是如何驱动硬件的? 硬件是需要相关的驱动程序才能执行,而驱动程序是安装在操作系统内核中.如果写了一个程序A,A程序想操作硬件工作,首先需要进行系统调用,由内核去找对应的驱动程序驱使硬件工 ...
- Solon v2.4.0 发布,Java 生态的新星燃起
Solon 是什么开源项目? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态规模).与其他框架相比,它解决了两个重要的痛点:启动慢 ...
- minipc安装与设置Ubuntu
此文章是对刚刚在某宝买的minipc进行的Ubuntu server安装,以及部分应用过程 安装Ubuntu server22 参考一文搞懂Ubuntu Server 22.04.2安装 问题记录 开 ...
- Cilium系列-4-Cilium本地路由
系列文章 Cilium 系列文章 前言 在前文中我们提到, cilium install 默认安装后, Cilium 功能启用和禁用情况如下: datapath mode: tunnel: 因为兼容性 ...