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

    比特币区块头结构 字段 大小(Byte) 说明 nVersion 4 区块版本号,表示本区块遵守的验证规则 hashPrevBlock 32 前一区块的哈希值,使用SHA256(SHA256(父区块头 ...

  2. centos8平台使用journalctl管理systemd-journald日志

    一,systemd-journald的作用 1,什么是systemd-journald? systemd-journald 是 systemd 自带的日志系统,是一个收集并存储各类日志数据的系统服务. ...

  3. django环境安装与项目创建方式

    1.安装django pip install django2.检查django版本 : python -m django --version 3.创建项目 django-admin startproj ...

  4. Gitlab 11.9.1 高可用教程

    Gitlab 11.9.1 高可用教程 一. PostgreSQL数据迁移 由于默认Gitlab的安装会内置Postgres数据库,并且没有对外,所以我们需要通过设置对应的Gitlab的配置将其中的数 ...

  5. 【应用服务 App Service】发布到Azure上的应用显示时间不是本地时间的问题,修改应用服务的默认时区

    问题情形 应用程序发布到App Service后,时间显示不是北京时间,默认情况为UTC时间,比中国时间晚 8 个小时. 详细日志 无 问题原因 Azure 上所有的服务时间都采用了 UTC 时间. ...

  6. jinjia2语言

    金家兔 网站: https://jinja.palletsprojects.com/en/2.11.x/ #Jinja is Beautiful {% extends "layout.htm ...

  7. ELK6环境搭建

    (一)什么是ELK Stack ELK 到底是什么呢? "ELK"是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kibana. E ...

  8. 使用经纬度得到位置Geocorder

    先得到经纬度再用geocorder 显示位置,需要手机打开位置权限,使用GPS的话把注释去掉,GPS在室内很容易收不到信号,得到位置为空 public class MainActivity exten ...

  9. APP UI自动化测试思路总结

    python+appium自动化测试系列就要告一段落了,本篇博客咱们做个小结. 首先想要说明一下,APP自动化测试可能很多公司不用,但也是大部分自动化测试工程师.高级测试工程师岗位招聘信息上要求的,所 ...

  10. 赛门铁克和DigiCert证书有什么区别?

    在众多国人眼里,赛门铁克Symantec名气更胜于DigiCert证书.但是,我们知道2017年赛门铁克因一系列原因被DigiCert收购,品牌名称也被更新为DigiCert Secure Site. ...