为了方便树莓派和电脑上相互传输数据文件的传输。也就是上传和下载文件,我自己就写了一个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文件管道 下载图集

    # -*- coding: utf-8 -*- import re from time import sleep import scrapy from scrapy.linkextractors im ...

  2. 【抽五分钟】使用VuePress创建在线文档中心

    内容目录 安装初始化核心配置导航栏配置侧边栏配置静态资源配置nginx部署typora编写 安装初始化 全局安装  npm install -g vuepress 创建目录 mkdir vurepre ...

  3. Helium文档10-WebUI自动化-Text识别网页上的任何文本或标签

    前言 Text关键字的作用是识别网页上的文字,在一般UI查找中使用率非常高,但是需要注意,如果网页上有相同的文字,那么只能识别到第一个 入参介绍 以下是Text的源码 有5个如参:后面4个参数是上下左 ...

  4. 性能测试之JVM的故障排查-堆内存泄漏

    JVM异常说明(超链接) 一文中已介绍了,JVM每个运行时区域--程序计数器 .Java虚拟机栈.本地方法栈.Java堆.方法区.直接内存发生OutOfMemoryError的不同原因和不同错误信息. ...

  5. forword与redirect

    1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地 ...

  6. 1024|推荐一个开源免费的Spring Boot教程

    2020-1024=996! 今天,星期六,你们是否加班了?我反正加了!早上去公司开了一早上会,中午回家写下了这篇文章. 今天,我要推荐一个开源免费的Spring Boot项目,就是我最近日更的Spr ...

  7. ret2libc--ROP(pwn)漏洞入门分析

    背景知识 fflush 函数,清理缓冲区. fflush(stdout) 一次性输出以上缓冲区所有数据 read(0,&buf,0xAu) 0代表标准输入,标准输出1,标准错误2,&b ...

  8. (python)getattr等用法

    getattr() 函数用于返回一个对象属性值; 语法 getattr(object, name[, default]) 参数 object -- 对象. name -- 字符串,对象属性. defa ...

  9. jq animate 的第二写法

    俩个参数的写法 例子: $('#div1').animate({num:'auto'},{ duration : 1000,   //运动时间 easing : 'linear',    //运动形式 ...

  10. 字符串截取 slice,substr,substring 的区别

    一 只传递一个参数时候 let str = '0123456'; str.slice(5); //'56' str.substr(5); // '56' str.substring(5); // '5 ...