为了方便树莓派和电脑上相互传输数据文件的传输。也就是上传和下载文件,我自己就写了一个ftp

主要是运用到hasattr与getattr

先看一下服务器上的程序吧

# _*_coding:utf-8_*_
# /usr/bin/env python3
# Author:book Miki import socketserver
import json
import os class MysocketHand(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
self.data = self.request.recv(1024)
commond = json.loads(self.data)
action = commond["action"]
if hasattr(self, action):
fun = getattr(self, action)
fun(commond)
print("{} wrote:".format(self.client_address[0]))
print(self.data.decode())
except ConnectionResetError as e:
print('eer', e)
break def put(self, *args):
''' 接收客户端文件 '''
cmd_dir = args[0]
filename = cmd_dir['filename']
filesize = int(cmd_dir['filesize'])
if os.path.isfile(filename):
f = open(filename + '.new', 'wb')
else:
f = open(filename, 'wb') self.request.send(b'200 ok')
recv_size = 0
recv_size = int(recv_size)
while recv_size < filesize:
recv_data = self.request.recv(1024)
f.write(recv_data)
recv_size += len(recv_data)
print("已经加载 %s :" % (recv_size/filesize*100))
print(recv_size, 'recv size', filesize, 'file size') else:
print(' %s is ok' % filename)
f.close() def get(self, *args):
filename = args[0]['filename'] msg_dir = {
'yes_or_no': 'none',
'file_size': 0
}
if os.path.isfile(filename):
file_size = os.stat(filename).st_size
msg_dir['yes_or_no'] = 'yes'
msg_dir['file_size'] = file_size
self.request.send(json.dumps(msg_dir).encode())
queren = self.request.recv(1024).decode()
if queren == 'y':
f = open(filename, 'rb')
for line in f:
self.request.send(line)
f.close()
else:
print('error') else:
msg_dir['yes_or_no'] = 'no'
self.request.send(json.dumps(msg_dir).encode()) if __name__ == '__main__':
HOST, POST = 'localhost', 9999
sever = socketserver.ThreadingTCPServer((HOST, POST), MysocketHand)
sever.serve_forever()

接下来是客户端的

# _*_coding:utf-8_*_
# /usr/bin/env python3
# Author:book Miki import socket
import os
import json class Myclient(object):
def __init__(self, ip, port):
self.client = socket.socket()
self.ip = ip
self.port = port
def help(self):
msg = '''
ls
cd
pwd
get filename
put filename
'''
def connent(self):
self.client.connect((self.ip, self.port)) def interactive(self):
while True:
msg = input('>>;')
if len(msg) == 0:
continue
mst_cmd = msg.split()[0]
if hasattr(self, "cmd_%s" % mst_cmd):
fun = getattr(self, 'cmd_%s' % mst_cmd)
fun(msg)
else:
self.help()
def cmd_put(self,*args):
cmd_split = args[0].split()
if len(cmd_split) > 1:
filename = cmd_split[1]
if os.path.isfile(filename):
filesize = os.stat(filename).st_size
msg_dic = {
"action": "put",
"filename": filename,
"filesize": filesize
}
self.client.send(json.dumps(msg_dic).encode())
# 防止粘包
self.client.recv(1024)
f = open(filename, 'rb')
for line in f:
self.client.send(line)
else:
print(filename, " is none")
def cmd_get(self,*args):
cmd_split = args[0].split()
if(len(cmd_split)>1):
filename = cmd_split[1]
msg_dic = {
"action": "get",
"filename": filename
}
self.client.send(json.dumps(msg_dic).encode())
action = json.loads(self.client.recv(1024))
yes_or_no = action['yes_or_no']
if yes_or_no == 'yes':
queren = input('downland %s y/n' % filename)
self.client.send(queren.encode())
if queren == 'y':
if os.path.isfile(filename):
f = open(filename+'new','wb')
else:
f = open(filename,'wb')
file_size = action['file_size']
recv_size = 0
while file_size > recv_size:
recv_data = self.client.recv(1024)
recv_size += len(recv_data)
f.write(recv_data)
print('已下载 : %s %%' % (recv_size / file_size *100))
else:
print('下载成功')
f.close()
else:
print('取消下载')
else:
print(json.loads(self.client.recv(1024)).decode()) a = Myclient('192.168.43.140', 9999)
a.help()
a.connent()
a.interactive()

如此一来我在树莓派上的数据就可以发送到本地了

可是我就在今天发现了prarmiko这个模块我真的是气死了因为他只需要三五行代码就解决了我两百多行代码的问题

请看

# 树莓派实证有效
import paramiko
transport =paramiko.Transport(('192.168.43.140',22))
transport.connect(username='pi',password='raspberrypi')
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put('text1', '/home/pi/python_code/python_ssh/socketsever.py')
# sftp.get('remove_path', 'local_path')
transport.close()

是不是太简单了?但是也不亏哈哈哈,自己写了一个ftp的简易版也算是了解了其中的奥妙了

python之ftp与paramiko与hasattr与getattr的更多相关文章

  1. python实现FTP程序

    python实现FTP程序 程序源码 上传功能 查看文件 cd功能 创建目录 程序源码 目录结构 服务端 主程序 import optparse import socketserver import ...

  2. Python实现FTP服务功能

    本文从以下三个方面, 阐述Python如何搭建FTP服务器 一. Python搭建FTP服务器 二. FTP函数释义 三. 查看目录结构 四. 上传下载程序 一. Python搭建FTP服务器 1. ...

  3. Python之FTP实现

    Python之FTP实现 上传下载: import socket import struct import json import subprocess import os class MYTCPSe ...

  4. 【转】Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍

    Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍 FTP 是File Transfer Protocol(文件传输协议)的英文简称,它基于传输层协议TCP建立,用于Interne ...

  5. Python之FTP多线程下载文件之分块多线程文件合并

    Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...

  6. Python之FTP多线程下载文件之多线程分块下载文件

    Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...

  7. [源码]python Scapy Ftp密码嗅探

    [源码]python Scapy Ftp密码嗅探 原理很简单,FTP密码明文传输的 截取tcp 21端口User和Pass数据即可 Scapy框架编译程序较大(一个空程序都25M),所以就不提供exe ...

  8. python实现FTP弱口令扫描器与简单端口扫描器

    python实现FTP弱口令扫描器与简单端口扫描器 目录 FTP弱口令扫描器 简单端口扫描器 参考: https://blog.csdn.net/rebelqsp/article/details/22 ...

  9. Python 基于Python实现Ftp文件上传,下载

    基于Python实现Ftp文件上传,下载   by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...

随机推荐

  1. python与嵌入式的火花

    一.前言 近些年来python非常流行,Python是一种面向对象的解释性计算机程序设计语言,Python语法简介清晰,易读性以及可扩展性,Python具有丰富和强大的库,能够把用其他语言制作的各种模 ...

  2. day24 Pyhton学习 反射

    一.isinstance,type,issubclass issubclass() 这个内置函数可以帮我们判断x类是否是y类的子类 issubclass(x,y) class Base: pass c ...

  3. 界面酷炫,功能强大!这款 Linux 性能实时监控工具超好用!

    对于维护.管理Linux系统来说,它的性能监控非常重要,特别是实时监控数据,这个数据有利于我们判断服务器的负载压力,及时调整资源调配,也有助于更好的服务于业务.所以,今天民工哥给大家安利一款 Linu ...

  4. PHP7下的协程实现 转

        前言 相信大家都听说过『协程』这个概念吧. 但是有些同学对这个概念似懂非懂,不知道怎么实现,怎么用,用在哪,甚至有些人认为yield就是协程! 我始终相信,如果你无法准确地表达出一个知识点的话 ...

  5. selenium--数据填充

    from time import sleep from selenium import webdriver br = webdriver.Chrome() url = "https://ww ...

  6. Linux关机时执行指定脚本

    要实现在Linux关机时执行某个脚本的具体思路 1.在文件夹 /etc/init.d/ 下创建关机时需要执行的脚本 file_name; 2.分别在文件夹 /etc/rc0.d/ 和 /etc/rc6 ...

  7. 第十三章 Linux三剑客之老二—sed

    一.sed #擅长增删改查 替换 选项: -n #取消默认输出 -r #支持扩展正则使用 -i #改变文件内容 -e #允许多项编辑 内部指令: p #print 打印 d    # 删除 排除 a ...

  8. 完美解决pyinstaller 打包报错找不到依赖pypiwin32 或pywin32-ctypes的错误

    报错信息 最近闲来无事,用python的tkinter库开发了一款带日程提醒的万年历桌面程序.在程序开发结束开始打包时,却发现一直报错 PyInstaller cannot check for ass ...

  9. Jmeter入门(5)- jmeter取样器的HTTP请求

    一.HTTP管理器 位置:线程组右键 ==> 添加 ==> 配置元件 1.HTTP信息头管理器 添加测试计划 添加线程组 添加HTTP请求 添加请求头(HTTP信息头管理器) 设置请求参数 ...

  10. 实战二:nacos服务注册与发现,openfeign服务调用

    一,参照上一篇创建好微服务结构后,按业务需求编写各微服务逻辑 二,服务注册 1,安装nacos:下载,解压,运行startup.cmd 2,访问 http://localhost:8848/nacos ...