python学习道路(day9note)(socketserver编程,ftp)
1.ftp client
#!/usr/bin/env python
#_*_coding:utf-8_*_
import socket
import subprocess
user_data = {
'user':None,
}
user_status = False #用户验证,只是当用户可以链接的时候需要去验证一下用户密码
def login():
count = 0
global user_status
while True:
user_name = input("请输入您的用户名>>>:")
with open('D:\\kkk\\day5work\\db.txt', 'r',encoding="utf-8") as files:
for i in files.readlines(): #整行读取
if user_name in i: #空格为分隔符生成字典
while True:
passwd = input("请输入您的密码>>>:")
if str(passwd) == str(i.split(' ')[-1].strip('\n')):#上面空格分隔符后面的密码
user_data['user'] = user_name
#print(user_data['user']) 调试用的可以删除
user_status = True
break
else:
count += 1
if count >= 3:
print('input passwd error')
exit("您输入过多次错误密码,将被锁定:") #锁定的方法还没有实现上去
if user_status == True:
break
login()
if user_status == True:
")
client = socket.socket()
client.connect(('10.10.10.140',8002)) #客户端需要链接的Ip 和 端口
while True:
msg = input('>>>:').strip() #用户输入想要执行的命令
if len(msg) == 0: continue #判断无输入继续
print('to server', msg)
client.send('put')
if 'put' in msg:
res_obj = subprocess.Popen('cat filename', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) #本地查看文件长度
res = res_obj.stdout.read() # 执行命令的结果
client.send(str(len(res)).encode()) # 命令执行结果的长度字符串一下
client.send(res) # 发送给客户端需要循环单次长度
if 'get' in msg:
client.send(msg.encode()) #将用户输入的命令编码,只接收二进制文件
date = client.recv(1024) #接收的文件字符数
print("res:",date.decode())
total_size = int(date.decode()) #将接收的字符串解码并整型
recevied_size = 0 #标识
res = b''
while recevied_size < total_size: #接收大小与总数相比
d = client.recv(1024)
res += d
old = open("filename.txt", "r+", encoding="utf-8")
old.write(d)
recevied_size += len(d) #每次循环加上之前获取的大小
# print("rece done----")
# print(res.decode())
if 'put' in msg:
client.send(msg.encode()) # 将用户输入的命令编码,只接收二进制文件
date = client.recv(1024) # 接收的文件字符数
print("res:", date.decode())
total_size = int(date.decode()) # 将接收的字符串解码并整型
recevied_size = 0 # 标识
res = b''
while recevied_size < total_size: # 接收大小与总数相比
d = client.recv(1024)
res += d
old = open("filename.txt", "r+", encoding="utf-8")
old.write(d)
recevied_size += len(d) # 每次循环加上之前获取的大小
#(家目录应该是字符串的拼接吧)
2.ftp server
#!/usr/bin/env python
#_*_coding:utf-8_*_
import socket
import subprocess
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建实例
server.bind(("0.0.0.0",8002)) #监听所有IP,端口
server.listen(5) #排列监听主机数,不是并发
print("--------listen-----------")
while True:
conn,client_addr = server.accept() #接受客户端的链接
while True:
date = conn.recv(1024) # 接收客户端发过来的字符串的长度
if 'put' in date:
total_size = int(date.decode()) # 将接收的字符串解码并整型
recevied_size = 0 # 标识
res = b''
while recevied_size < total_size: # 接收大小与总数相比
d = conn.recv(1024)
old = open("filename.txt", "r+", encoding="utf-8")
old.write(d)
res += d
recevied_size += len(d) # 每次循环加上之前获取的大小
print("rece done----")
if 'get' in date:
res_obj = subprocess.Popen('cat filename',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #在本机实行的命令
res = res_obj.stdout.read() #执行命令的结果
conn.send(str(len(res)).encode()) #命令执行结果的长度字符串一下
conn.send(res) #发送给客户端需要循环单次长度
python学习道路(day9note)(socketserver编程,ftp)的更多相关文章
- python学习之路网络编程篇(第四篇)
python学习之路网络编程篇(第四篇) 内容待补充
- python学习之路网络编程篇(第二篇)
新课程知识的引入:python作用域 #python中无块级别作用域 if 1 == 1 : name = 'alex' print(name) for i in range(10): name = ...
- python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)
1.#面向对象 #抽象接口 === 抽象类 #就是架构师给你一个架子,你们去写,如果满足不了直接报错 #python2 print("python2---抽象类".center(2 ...
- python学习笔记11 ----网络编程
网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. ...
- python学习笔记10 ----网络编程
网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. ...
- Python学习之==>Socket网络编程
一.计算机网络 多台独立的计算机通过网络通信设备连接起来的网络.实现资源共享和数据传递.在同一台电脑上可以将D盘上的一个文件传到C盘,但如果想从一台电脑传一个文件到另外一台电脑上就要通过计算机网络 二 ...
- python 学习笔记7 面向对象编程
一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...
- python学习道路(day11note)(协程,同步与异步的性能区别,url爬网页,select,RabbitMq)
1.协程 #协程 又称微线程 是一种用户的轻量级线程 程序级别代码控制 就不用加机器 #不同函数 = 不同任务 A函数切到B函数没有进行cpu级别的切换,而是程序级别的切换就是协程 yelied #单 ...
- python学习道路(day10note)(线程,进程)
1.计算机的发展史 看alex的博客吧,了解一下可以了 2.线程与GIL简介 #线程 #一道单一的指令的控制流,寄生在进程中 #单一进程里的多个线程是共享数据的 #多个线程涉及修改共享数据的时候需要枷 ...
随机推荐
- Oracle 过程中检查数据表存在与否
在过程中,尤其是每天执行的任务,通常要检查查询的数据表存在不存在,如果不存在则等待一段时间在进行执行,以下代码实现了这个功能,如果表不存在,抛出异常,交给异常处理代码,确保数据完整性 使用方法:p_C ...
- 【安装MongoDB】CentOS7 下安装NodeJs+Express+MongoDB+Redis
MongoDB,V3.2版本,官网说的很详细,见链接:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 1.创建 ...
- VC++ 产生GUID或UUID
GUID 和 UUID 是一样的,表示全球唯一标识码. 下面是Windows系统中,产生GUID的一种方法(Windows API) char* GUID_Generator() { ] = {}; ...
- yii模块下面的组件
模块的定义就不写了,直接进入主题看目录和文件: application/modules/client/controllers/UserController.php <?php class Use ...
- 查看cpu的信息cat /proc/cpuinfo
cat /proc/cpuinfo processor : vendor_id : GenuineIntel cpu family : model : model name : Intel(R) Co ...
- 【基础知识】UML基础
http://www.ibm.com/developerworks/cn/rational/r-uml/
- Yii2 用户登录
在Yii2的basic版本中默认是从一个数组验证用户名和密码,如何改为从数据表中查询验证呢?且数据库的密码要为哈希加密密码验证? 下面我们就一步一步解析Yii2的登录过程. 一. 创建user表模型 ...
- 复制Eclipse工作空间设置
将新建的workspace下的.metadata.plugins内容全部删除: 将原来的workspace下的.metadata.plugins内容除了org.eclipse.core.resourc ...
- RUDP之三 —— Virtual Connection over UDP
原文链接 原文:http://gafferongames.com/networking-for-game-programmers/virtual-connection-over-udp/ Introd ...
- 一步一步打造自己的Android图片浏览器(原创)
今天我们试着来制作一个自己的Android图片浏览器. 图片浏览器应该具有什么功能呢?鉴于不同的人不同的理解,这里提出一个基本的需求: 搜索手机内的所有图片,展示于一个列表中: 列表中展示的是图片的缩 ...