简要

使用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文件下载服务的更多相关文章

  1. Python socket编程客户端与服务端通信

    [本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...

  2. python socket 客服端服务端编程

    客服端编程 import socket try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error a ...

  3. [原创]python之socket-ftp

    今天来讲讲ftp文件下载,感觉挺有趣的,知道吧,就那种看到新文件生成,而自己写的代码也不多,那种成就感! 一.需求: 客户端发送指令给服务端,服务端根据指令找到相应文件,发送给客户端 分析: PS:e ...

  4. Python开发【Tornado】:搭建文件下载服务、音频文件播放

    Tornado 如何做文件下载 要求:浏览器输入url地址,直接弹窗提示下载 Tornado服务端,搭建文件下载服务 #!/usr/bin/env python # -*- coding:utf-8 ...

  5. C#本地文件下载以及FTP文件服务下载(以Pdf文件为例)

    一.C#实现本地文件下载 1.文件下载的路径  文件名称 以及文件下载之后要放的位置  这三个变量是必须要的 2.定义以下四个对象: FileWebRequest ftpWebRequest = nu ...

  6. 25 python socket网络编程

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

  7. socket实现ftp上传下载

    socket实现ftp文件的上传和下载 server端代码: import socket import json import struct import os soc = socket.socket ...

  8. day34 异常处理、断言、socket之ftp协议

    Python之路,Day20 = 异常处理.断言.socket之ftp协议 参考博客:http://www.cnblogs.com/metianzing/articles/7148191.html 异 ...

  9. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  10. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

随机推荐

  1. 【python基础】复杂数据类型-字典(增删改查)

    1.初识字典 字典,是另外一种复杂的数据类型,相较于列表,字典可以将相关信息关联起来.比如说一个人的信息有名字.年龄.性别等,如果用列表存储的话,不能表示他们之间是相关联的,而字典可以,字典是一个或多 ...

  2. PyTorch与机器学习中的随机化:减少噪声和随机性

    目录 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成与测试 4. 应用示例与代码实现讲 ...

  3. Java使用joml计算机图形学库,将3D坐标旋转正交投影转为2D坐标

    最近遇到了一个困扰我许久的难题,现将解决方案分享出来 由于我们的项目侧重点在前端绘图,导致了前后端工作量不协调,我后端接口很快就能写完,而前端一个图要画好久,领导见状将前端的任务分到后端一部分用Jav ...

  4. 除了参数,ref关键字还可以用在什么地方?

    <老生常谈:值类型 V.S. 引用类型>中花了很大的篇幅介绍ref参数针对值类型和引用类型变量的传递.在C#中,除了方法的ref参数,我们还有很多使用ref关键字传递引用/地址的场景,本篇 ...

  5. 【环境搭建】多版本的jdk共存

    问题来源 burpsuite 2021需要使用Java 9及以上版本,而其他工具需要Java 8,因此需要两个版本共存,并且做到除了burpsuite以外的工具默认使用Java 8打开. 需要的软件 ...

  6. ChatGPT帮助工程师写代码:从功能模块完善到成功执行,实现需求

    在软件开发过程中,经常会遇到需要完善功能模块.调试代码和解决问题的情况.为了提高效率,我们可以借助人工智能技术,例如OpenAI的ChatGPT语言模型,来协助我们进行代码编写和调试.本文将介绍一个案 ...

  7. MAUI中如何打开应用商店应用详情页

    //打开本应用的应用商店详情页 public Task<bool> OpenStoreAppDetails() { return OpenStoreAppDetails(AppInfo.P ...

  8. React:styled-components有趣的用法

    背景 用于记录一些styled-components的有趣的用法 绑定a标签的链接 编写伪类 在styleComponents中使用参数 传入参数

  9. Ubuntu新建Django工程错误:ModuleNotFoundError: No module named 'distutils.core'

    ubuntu18.04 默认没有安装 pip ,需要安装 python3-pip,即可解决 1 sudo apt-get install python3-pip 在shell脚本中输入以下命令: 1 ...

  10. 面霸的自我修养:JMM与锁的理论

    王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是<面霸的自我修养>的第二弹,内容是 Java 并发编程中关于 Java 内存模型(Ja ...