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 ...
随机推荐
- [ARM汇编]计算机原理与数制基础—1.1.2 二进制与十进制数制转换
在计算机中,我们通常使用二进制数制来表示数据,因为计算机的基本电平只有两种状态:高电平(通常表示为 1)和低电平(通常表示为 0).而在我们的日常生活中,我们习惯使用十进制数制.为了方便理解,我们需要 ...
- 【LeetCode】Find Pivot Index #724 Rust Solution
给定一个整数类型的数组 nums,请编写一个能够返回数组 "中心索引" 的方法.我们是这样定义数组 中心索引 的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和.如果数 ...
- Dubbo负载均衡策略之 一致性哈希
本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用.通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的 ...
- 从2PC和容错共识算法讨论zookeeper中的Create请求
最近在读<数据密集型应用系统设计>,其中谈到了zookeeper对容错共识算法的应用.这让我想到之前参考的zookeeper学习资料中,误将容错共识算法写成了2PC(两阶段提交协议),所以 ...
- 一文了解Go语言的I/O接口设计
1. 引言 I/O 操作在编程中扮演着至关重要的角色.它涉及程序与外部世界之间的数据交换,允许程序从外部,如键盘.文件.网络等地方读取数据,也能够将外界输入的数据重新写入到目标位置中.使得程序能够与外 ...
- 图书商城Vue+Element+Node项目练习(...)
本系列文章是为学习Vue的项目练习笔记,尽量详细记录一下一个完整项目的开发过程.面向初学者,本人也是初学者,搬砖技术还不成熟.项目在技术上前端为主,包含一些后端代码,从基础的数据库(Sqlite).到 ...
- 统信UOS系统开发笔记(八):在统信UOS上编译搭建mqtt基础环境(版本使用QMQTT::Clinet)
前言 统信uos使用到mqtt开发,需要重新编译mqtt,本篇描述统信uos20上的mqtt源码编译和环境搭建. 注意 这里下载的mqtt版本与其他几篇文章的不同,这里是使用QMQTT:: ...
- 详解RISC v中断
声明 本文为本人原创,未经许可严禁转载.部分图源自网络,如有侵权,联系删除. RISC-V 中断与异常 trap(陷阱)可以分为异常与中断.在 RISC v 下,中断有三种来源:software in ...
- 封装一个可以左右滑动的Blazor组件
为什么要封装组件 最近写MAUI Blazor的时候,总是苦于对移动端没有什么好的支持,没有一个能左右滑动的tab切换组件. 既然没有,那就自己封装一个. 简单了解轮播图.tab切换的库之后,决定使用 ...
- 使用JMeter连接达梦数据库的步骤和示例
引言: 本文将介绍如何使用JMeter连接达梦数据库,并提供连接达梦数据库的步骤和示例,帮助您快速开始进行数据库性能测试. 步骤: 1. 下载并安装JMeter:首先,从JMeter官方网站下载并安装 ...