python局域网访问主机网站_用python打造一个基于socket的文件(夹)传输系统

news/2024/5/20 17:09:20/文章来源:https://blog.csdn.net/weixin_32824369/article/details/112543024

ce34bf65baface74975babced18286f3.png

这段时间在学习python,接触到了网络编程中的socket这块,加上自己在用的Linux服务器都是原生支持python的,于是乎有了个做文件传输功能程序的想法。

毕竟python语言中,有下载功能的框架一抓一大把,但是主机与主机间快速搭建文件(夹)传输通道的程序似乎不常见,因为我刚接触python不久,但是我不知道也不奇怪,总得来说,自己做一个练手,成就感满满。

项目地址

https://github.com/Ccapton/python-stuff/tree/master/filetransporter

实操预览

33dae8043cd563876703cfcf29033dd8.png

本地主机发送文件到远端服务器主机。

思维导图

01010b8d2ab17490ad6f5cc35020a7f2.png文件传输系统

以上思维导图仅供参考,毕竟表达能力有限,具体功能要追究到代码处才能分析其原理。

原理

基于socket的通信,相信会编程的朋友都不陌生,而通过socket来传输文件也是很常见的,但是这仅仅是对于单个文件来说很容易实现。

如果是多文件呢?

我在实现本系统之前尝试了几次,用单一socket通道来传输多文件不切实际,因为调用socket.recv()方法的时候,返回的数据格式是原始数据str类型,要分割不同文件的数据有很大难度。

因为涉及到接收、发送方两端文件数据接收和发送进度的统一性,就要用另外的指令来控制传输工作不乱套,于是我想到多开一个socket作为传输指令的通道,这样指令和数据就分离了,也就容易控制传输工作了!所以有了指令线程数据线程之分。

要实现传输整个文件夹,首先要遍历这个文件夹,把在其内的所有文件结构准确无误的还原出来;因为是通过一个socket通过传输数据,所以传输文件只能一个接一个来,这样,文件的遍历工作只能等前一个文件传输完毕后才能继续进行,于是又要对遍历工作设计一番。

经过改造,我在文件查找(遍历)器内加入了while循环体和供外界继承的回调类,这样就能达到我想要的文件通过socket按顺序传输的效果了。

文件查找器FileFinder(阻塞型)源码:

import os,time# 文件、文件夹寻找类 (阻塞型)# 阻塞的设计:为了等待调用者的耗时操作【否则很快就完成了文件的遍历任务,调用者达不到顺序操作文件(夹)的意图】class FileFinder:   def __init__(self,finderCallback):       self.finderCallback = finderCallback       # 文件(夹)路径下所有文件的总大小       self.sum_size = 0       # 调用者控制的参数,若为False,则遍历工作继续进行,若为True,则阻塞任务,等待调用者完成它的其他耗时操作后在考虑是否改变此值       self.recycle = True       # 调用者控制的参数,若为False,则正常工作,若为True,则当recycle为False时遍历工作不阻塞快速完成,recycle为True时遍历工作阻塞       self.off = False    # 文件(夹)找到时的回调类   class FinderCallback:       # 找到文件夹       def onFindDir(self,dir_path):           pass       # 找到文件       def onFindFile(self,file_path,size):           pass       # 预留的刷新函数       def onRefresh(self):           pass   # 查找文件(夹)方法   def list_flie(self,root_dir):       if  os.path.isfile(root_dir):           while self.recycle:               time.sleep(0.05)           if self.finderCallback:               self.finderCallback.onFindFile(root_dir,os.path.getsize(root_dir))               self.finderCallback.onRefresh()               if not self.off:                  self.recycle = True       else:           dirlist = os.listdir(root_dir)  # 列出文件夹下所有的目录与文件           for dir in dirlist:               path = os.path.join(root_dir, dir)               if os.path.isfile(path):                   while self.recycle:                       time.sleep(0.05)                   if self.finderCallback:                       self.finderCallback.onFindFile(path,os.path.getsize(path))                       self.finderCallback.onRefresh()                       if not self.off:                          self.recycle = True               else:                   while self.recycle:                       time.sleep(0.05)                   if self.finderCallback:                       self.finderCallback.onFindDir(path)                       self.finderCallback.onRefresh()                       if not self.off:                          self.recycle = True                   # 递归调用(当遍历到文件夹时,继续遍历,直到当前文件夹下没有文件夹为止)                   self.list_flie(path)
通过继承FileFinder的回调类FinderCallback,重写其 onFindDir(self,dir_path) 和onFindFile(self,file_path,size)方法,在这两个方法里面发送相关指令到接收端。但最难的就是两端的指令线程内的socket指令信息的处理,这需要深入代码去具体研究,本人能力有限,也就不细说了。需要研究一番的朋友,请移步该项目地址 https://github.com/Ccapton/python-stuff/tree/master/filetransporter

注意

运行接收端程序,需要一个能访问的地址,也即是说最好是局域网内进行文件传输工作,因为局域网本地ip都是可以直接访问的,若是在公共网络传输文件,必须知道接收方主机的公网ip和内网ip。例如我现在用到接收方主机是腾讯云的主机,内网ip是10.135.xxx.xxx,公网ip是111.120.xxx.xxx。该主机内,运行接收(服务)端程序
python3 ftserver.py -i 10.135.xxx.xxx -d /home/ubuntu/downloads
而在你的主机运行发送(客户)端程序发送文件夹bilibili
python3 ftclient.py -i 111.120.xxx.xxx -f /Users/capton/desktop/bilibili
因为腾讯云、阿里云等国内虚拟主机供应商是采用NAT地址转换对云主机进行地址分配的,所以按照我上面的步骤来运行两端程序才能连通。

- END -

原文链接:

https://www.jianshu.com/p/07ff2a7d22f4

文源网络,仅供学习之用,如有侵权,联系删除。

往期精彩

8a5967bc0fc460078f6c5769b336e308.png

◆  50款开源工具你都用过吗?

◆  python+C、C++混合编程的应用

◆  python网络爬虫的基本原理详解

c9e6fb9f1af50244ba3e0848da7396b7.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_795922.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php网站开发文本格式设置,html文件是纯文本文件吗

html文件是纯文本文件。HTML文本是由HTML命令组成的描述性文本,是一种静态的网页文件。HTML文件在编辑时只能写入纯文本,无法像“.doc”文档那样直接为文字内容做样式。本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。Fi…

浅谈跨网站脚本攻击(XSS)的手段与防范(简析新浪微博XSS攻击事件)

本文主要涉及内容: 什么是XSSXSS攻击手段和目的XSS的防范新浪微博攻击事件什么是XSS 跨网站脚本(Cross-sitescripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它…

如何将网站的搜索功能加入到浏览器的搜索框 (IE7/FF2)

1.效果图: Internet Explorer 7 Firefox 2/3 2. 实现方式 创建一个包含Open Search协议的XML文档. 新手可以访问 http://www.microsoft.com/windows/ie/searchguide/, 利用微软提供的这个页面方便快速生成这个XML文档代码(点View XML), 然后保存到你的网站目录中 (比如 /opense…

9. R语言学习或者贝叶斯学习比较好的资源网站

随手记录好网站 1.【R语言相关】 http://adv-r.had.co.nz/ 是关于R语言的一些比较高级的用法,其中http://adv-r.had.co.nz/C-interface.html 是对R语言的C接口的一个比较详细的介绍,帮了很多忙!R和C接口的问题太难百度了!这个网站…

一步步教你为网站开发Android客户端

#友盟杯#一步步教你为网站开发Android客户端 楼主 发表于 2011-11-29 10:30:10|查看: 10907|回复: 225本帖最后由 liupeinye 于 2011-11-30 10:37 编辑 本文参与:友盟—安卓巴士Android开发原创教程大赛本文面向Android初级开发者,有一定的Java和Android…

关于电脑的基础知识_SEO优化基础知识(新手必备)

现在网上关于SEO优化的知识很多也很杂,很多新手都不知道如何选择,于是对各种SEO优化基础知识我们进行了整理,但不是很详细,不过希望能帮助SEO新手更多的了解一下seo基础知识。 一、选好主域名并做好URL标准化通常情况下我们都会将…

asp sql 导出 excel_西部数码网站管理助手创建、导入恢复、导出备份mysql数据库...

版权归西部数码所有,原文链接:https://www.west.cn/faq/list.asp?unid612首先请确保您的服务器使用的是西部数码默认的环境配置,如果您是自己手工配置的环境,则以下操作可能会报错或失败。Mysql的建立:1.打开我司网站…

【大型网站技术架构笔记】(一)演化过程

开篇明义: 【大型网站技术架构笔记】系列是阅读《大型网站技术架构核心原理与实践》一书的一些笔记,记录了原书的一些重要内容以及我的个人理解。其中很多内容网上都能找得到。其实整本书,我最赞同的是作者阐述的网站架构的价值观——“业务成…

【大型网站技术架构笔记】(四)伸缩性、可扩展性与安全

网站架构的伸缩性设计 一般手段有两种。一类是根据功能进行物理分离,一类是对单一功能进行集群化来实现。比如将缓存、静态文件、数据库服务从服务器中拆分进行单独部署,比如对业务逻辑进行横向纵向切分等,都属于通过物理分离来达成整个系统…

网站HTTPS 实践(一): HTTPS协议和原理

1、前言 百度已经于近日上线了全站 HTTPS 的安全搜索,默认会将 HTTP 请求跳转成 HTTPS。本文重点介绍 HTTPS 协议, 并简单介绍部署全站 HTTPS 的意义。 2、HTTPS 协议概述 HTTPS 可以认为是 HTTP TLS。HTTP 协议大家耳熟能详了,目前大部分 WEB 应用和网…

管理网站服务器地址,如何使用phpIPAM来管理IP地址和子网

通常,网络或系统管理员有责任来管理其所管理的网络下的一个或多个子网。例如,当一个网段分配了/24子网,那么该子网就有254个IP地址可以用于不同用途。要跟踪某个IP被分配到了哪个主机,就需要通过某种方式记录下来。最简单的方法&a…

网站服务器系统,选windows还是linux?

windows系统和linux系统,是目前网站服务器使用最多的2大服务器系统,当然,还有unix也可以作为服务器系统,只是已经被边缘化,很少见到。那么,在我们购买网站服务器时,是选择windows系统好&#xf…

别让SSL证书暴露了你的网站服务器IP

我们通常会用cdn套到服务器ip上,来为网站或者后端程序做加速、防御。可是nginx在设计上有个小缺陷,会因为ssl证书泄露网站的原IP原理 用Nginx部署网站,在默认或不正确的配置下,网站开启ssl,直接访问ip的443端口&#…

好的网站推荐

1.深度学习方面 https://zh.gluon.ai/chapter_introduction/deep-learning-intro.html 李沐(2018 年 9 月)将算法、公式、图片、代码和样例统一进一本适合阅读的书 https://zhuanlan.zhihu.com/c_94953554 Sherlock ・关于专栏 介绍机器学习&#x…

python的学习网站

1.讲解pdb的调试 https://learnku.com/docs/pymotw/pdb-interactive-debugger/3470

获取关键字微博_网站获取高质量外链的渠道 - 提高神马排名

原出处:超级排名系统原文链接:网站获取高质量外链的渠道 - 超级排名系统在整个网站的优化中,外链仍然非常重要。尤其是在网站刚刚上线、处于新站期的情况下,更需要高质量的外链支持。外部链不仅可以引导蜘蛛抓取网站内容&#xff…

linux创建网站命令,Linux 创建链接命令 ln -s 软链接

这是Linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。当 我们需要在不同的目录,用到相同的文件时,…

Phpcms V9手机门户设置教程:怎么用PC V9做手机网站

一、在PHPcms V9管理后台设置手机门户 1.1、开启手机网站。位置:模块 》手机门户 》 添加手机站点,具体设置可参照截图:填写站点名和LOGO文件相对位置,绑定用于手机网站的二级域名m.cmsyou.com,域名以http://开头。1.2…

GitHub钩子同步项目代码到网站目录

对于个人项目而言,有的人项目托管在github上,线上访问地址放在自有服务器上。平时自己开发的话,要先push到github,在到自己服务器上pull下来(服务器上装了git),特别麻烦。github有个webhook,可以在push之后…

大型网站负载均衡核心原理与服务器集群的伸缩性设计

当系统面临大量用户访问,负载过高的时候,通常会使用增加服务器数量来进行横向扩展,使用集群和负载均衡提高整个系统的处理能力。主要有以下几种解决方案:1. HTTP重定向 Web服务器可通过Http响应头信息中的Location标记来返回一个新…