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简介 #线程 #一道单一的指令的控制流,寄生在进程中 #单一进程里的多个线程是共享数据的 #多个线程涉及修改共享数据的时候需要枷 ...
随机推荐
- django orm字段和参数
字段 1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=Tr ...
- Websocket通讯简析
什么是Websocket Websocket是一种全新的协议,不属于HTTP无状态协议,协议名为"ws",这意味着一个Websocket连接地址会是这样的写法:ws://**.We ...
- Android杂记:genymotion与eclipse报错问题
用eclipse启动genymotion时有时候会报 The connection to adb is down, and a severe error has occured. You must r ...
- 解决ssh远程登陆linux显示-bash-4.1$
cp -pr /etc/skel/.bash* /home/test/ #/home/test是用户目录改变用户家目录:usermod -md /tmptest test
- 1 javascript 核心语言笔记
//所有的双斜线之后的内容都属于注释; //变量是表示值的一个符号名字; //变量是通过var 关键字声明的; var x; //声明一个变量 //值可以通过等号赋值给变量 x = 0; //现在的变 ...
- Android Studio增加NDK代码编译支持--Mac环境
Android的APP开发基本都是使用Java或者跨平台框架进行开发的,对于很多APP来说已经足够了,但是,对于提供功能给外部使用或者性能要求很高的需求下,如图像处理等,可能会需要C/C++库的支持, ...
- CSS常用知识点
块级元素:width宽和height高有效. 内联元素:width宽和height高无效. 1.float:该属性的值指出了对象是否及如何浮动. none:设置对象不浮动left:设置对象浮在左边ri ...
- Android 框架练成 教你打造高效的图片加载框架(转)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41874561,本文出自:[张鸿洋的博客] 1.概述 优秀的图片加载框架不要太多, ...
- OpenCv Mat操作总结
Author:: Maddock Date: 2015-03-23 16:33:49 转载请注明出处:http://blog.csdn.net/adong76/article/details/4053 ...
- Redis学习笔记(4) Redis事务、生存时间及排序
1. Redis事务 Redis中的事务(transaction)是一组命令的集合,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次 ...