为了方便树莓派和电脑上相互传输数据文件的传输。也就是上传和下载文件,我自己就写了一个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. MeteoInfoLab脚本示例:AVHRR HDF数据

    这里演示读取和绘制AVHRR hdf格式数据,以sst(海表面温度)为例. 脚本程序: #Add data file f = addfile('D:/Temp/hdf/2006001-2006005. ...

  2. selenium登录163邮箱,得到cookie,requests后续请求

    1.场景 很多时候登录操作是比较复杂的,因为存在各种反爆破操作,以及为了安全性提交数据都会存在加密.如果要完全模拟代码去实现登录操作是比较复杂,并且该网站后续更新了登录安全相关功能,那么登录的模拟操作 ...

  3. python xlrd读取Excel文件

    1 import xlrd 2 3 #打开excel文件 4 book = xlrd.open_workbook('salary.xls') 5 6 #打印每个工作表的名称 7 for sheet i ...

  4. mysql 操作数据库

    创建数据库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name(数据库名字) #添加 IF NOT EXISTS,如果已有数据库,将会提醒,不会出现错 ...

  5. sublime text2的插件

    编写html代码,一定要使用emmet(前身是zencoding),还有以下插件也是可以考虑的:bracketHighter 高亮引号.括号等code Aligment 代码对齐DocBlockr 如 ...

  6. centos8平台使用rz/sz上传下载文件

    一,rz/sz的用途 1,rz,sz是Linux/Unix服务器同客户端通过ZModem进行文件传输的命令行工具 说明:客户端需要使用支持ZModem的telnet/ssh客户端(比如windows平 ...

  7. SpringCloud 与 SpringBoot版本问题

    如果SpringBoot版本与SpringCloud版本不一致,SpringBoot应用启动会报错: 解决方案: 版本对应关系可以在 https://start.spring.io/info 上查看: ...

  8. git常见操作和指令

    1.指令集 1.1 本地与远程操作 创建文件 echo > README.md(文件名) 创建文件时输入信息 echo "(message)" >> README ...

  9. MFiX-DEM中的并行碰撞搜索

    基于MFiX-19.2.2 DEM并行程序中的颗粒循环 在DEM并行程序中,每个进程只循环该进程包含的颗粒,并且每个进程还有一层ghost cell,用来存放另一个进程发送过来的颗粒信息. 下面添加一 ...

  10. Apache POI 合并单元格--简单解释版带Demo

    合并单元格所使用的方法: sheet.addMergedRegion( CellRangeAddress  cellRangeAddress  );   CellRangeAddress  对象的构造 ...