• 服务器端:server_server.py
 #!usr/bin/env python
# -*- coding:utf-8 -*-
# auther:Mr.chen
# 描述: import socket
import os
import threading
import time
import json
from user_users import PersonInfo DIR = os.path.dirname(os.path.abspath(__file__))
DIR = DIR+'/Folder/' TAG = True def tcplink(conn,addr):
"""
tcp请求分析函数
:param conn: tcp连接对象
:param addr: 连接地址
:return:
"""
print ("收到来自{0}的连接请求".format(addr))
conn.send('与主机通信中...')
while TAG:
try:
data = conn.recv(4096)
time.sleep(1)
if not data:
break
else:
print (data)
if data == 'ls':
P.view_file(conn)
continue
action,filename = data.strip().split()
action = action.lower()
if action == 'put':
re = P.Recvfile(conn,filename)
if re == True:
print ("文件接收成功!")
else:
print ("文件接收失败!")
elif action == 'get': P.Sendfile(conn,filename)
elif action == 'login':
name, password = filename.split(',')
P = PersonInfo(name, password)
re = P.login()
if re == True:
conn.send('Ready!')
else:
conn.send('False!')
elif action == 'register':
name,password = filename.split(',')
P = PersonInfo(name, password)
re = P.register()
if re == True:
conn.send('Ready!')
else:
conn.send('False!')
else:
print ("请求方的输入有错!")
continue
except Exception,e:
print "tcplink处理出现问题",e
break if __name__ == '__main__':
host = 'localhost'
port = 8888
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(5)
print ("服务运行中:正在监听{0}地址的{1}端口:".format(host,port))
while TAG:
# 接受一个新连接
conn,addr = s.accept()
# 创建一个新线程处理TCP连接
t = threading.Thread(target=tcplink,args=(conn,addr))
t.start()
  • 服务器端:user_users.py
 #!usr/bin/env python
# -*- coding:utf-8 -*-
# auther:Mr.chen
# 描述: import time
import os
import pickle class PersonInfo:
"""
用户模型类
"""
DIR = os.path.dirname(os.path.abspath(__file__))
DIR = DIR + '/Folder/'
ConfigDir = DIR.replace('Folder','db') def __init__(self,name,password):
self.Name = name #用户名
self.Password = password #密码
self.DIR = PersonInfo.DIR + self.Name +'/' #用户家目录 def login(self):
"""
用户登陆
:return:
"""
dict = PersonInfo.config_read()
if dict == None:
return False
if self.Name in dict:
if dict[self.Name] == self.Password:
return True
return False def register(self):
"""
用户注册
:return:
"""
if os.path.exists(self.DIR) != True:
os.system('mkdir'+' '+ self.DIR)
try:
dict = PersonInfo.config_read()
if dict == None:
dict = {}
if self.Name not in dict:
dict[self.Name] = self.Password
else:
print ("姓名重复")
return False
re = PersonInfo.config_write(dict)
if re == True:
return True
except Exception,e:
print "注册出现异常!",e
return False def view_file(self,conn):
"""
查看用户家目录
:param conn:
:return:
"""
data = os.popen('ls'+' '+ self.DIR).read()
conn.sendall(data) def Recvfile(self,conn,filename):
"""
接收文件方法
:param conn:tcp连接对象
:param filename:目标文件名
:return:
"""
print ("开始接收文件...")
conn.send('Ready!')
buffer = []
while True:
d = conn.recv(4096)
if d == 'exit':
break
else:
buffer.append(d)
data = ''.join(buffer)
if data == '':
return False
print (data)
print (filename)
print (self.DIR)
with open(self.DIR + filename, 'w') as f:
f.write(data)
return True def Sendfile(self,conn,filename):
"""
放送文件方法
:param conn: tcp连接对象
:param filename: 目标文件名
:return:
""" if os.path.exists(self.DIR + filename):
print ("开始放送文件...")
conn.send('Ready!')
time.sleep(1)
with open(self.DIR + filename, 'r') as f:
while True:
data = f.read(4096)
print (data)
if not data:
break
conn.sendall(data)
time.sleep(1)
conn.send('exit')
print ("文件放送成功!")
else:
conn.send('False!') @staticmethod
def config_read():
"""
配置文件全部读取
:return:
"""
if os.path.exists(PersonInfo.ConfigDir+'user_config'):
with open(PersonInfo.ConfigDir+'user_config','r') as f:
dict = pickle.load(f)
return dict @staticmethod
def config_write(dict):
"""
配置文件全部写入
:param dict:
:return:
"""
with open(PersonInfo.ConfigDir + 'user_config', 'w') as f:
pickle.dump(dict,f)
return True
  • 客户端:server_client.py
#!usr/bin/env python
# -*- coding:utf-8 -*-
# auther:Mr.chen
# 描述: import socket,os
import time
TAG =True DIR = os.path.dirname(os.path.abspath(__file__))
DIR = DIR+'/Folder/'
HOST = 'localhost'
PORT = 8888 def Recvfile(s,filename):
"""
接收文件方法函数
:param s: 套接字封装对象
:param filename: 目标文件名
:return:
"""
print ("开始下载文件...")
buffer = []
while TAG:
d = s.recv(4096)
if d == 'exit':
break
buffer.append(d)
data = ''.join(buffer)
with open(DIR+filename,'w') as f:
f.write(data)
print ("文件下载完毕!") def Sendfile(s,filename):
"""
放送文件方法函数
:param s: 套接字封装对象
:param filename: 目标文件名
:return:
"""
print ("开始上传文件!")
if os.path.exists(DIR+filename):
with open(DIR+filename,'r') as f:
while TAG:
data = f.read(4096)
if not data:
break
s.sendall(data)
time.sleep(1)
s.send('exit')
print ("文件上传完毕")
else:
print ("你的目录里没有这个文件")
time.sleep(1)
s.send('exit') def Confirm(s,command):
"""
验证与服务器连接是否正常;
把用户命令发过去,让服务器做好相应准备准备
:param s: 套接字封装对象
:param command: 用户输入的命令
:return:
"""
s.sendall(command)
re = s.recv(4096)
if re == 'Ready!':
return True
elif re == 'False!':
return False
else:
print ("与服务器连接出现异常!") def File_transfer(s):
"""
用户指令函数
:param s:
:return:
"""
while TAG:
command = raw_input("请输入你想执行的命令>>")
if not command:
continue
if command.lower().strip() == 'help':
print ("请用'put'+'空格'+'文件名'的格式上传文件")
print ("请用'get'+'空格'+'文件名'的格式下载文件")
print ("输入'ls'查看用户服务器家目录")
continue
if command.lower().strip() == 'ls':
s.send('ls')
data = s.recv(4096)
print (data)
continue
try:
action,filename = command.strip().split()
action = action.lower()
except:
print ("您的输入有误!输入help查看帮助文档")
continue
if action == 'put':
re = Confirm(s,command)
if re == True:
Sendfile(s, filename)
else:
print ("对方服务器没有准备好!")
break
elif action == 'get':
re = Confirm(s,command)
if re == True:
Recvfile(s, filename)
elif re == False:
print ("服务器家目录没有这个文件")
else:
print ("对方服务器没有准备好!")
break
else:
print ("你输入的命令有误!输入help查看帮助文档") def Login(s):
"""
用户登录
:param s:
:return:
"""
name = raw_input("请输入你的用户名:")
password = raw_input("请输入你的密码:")
command = 'login'+' '+ name + ',' + password
re = Confirm(s, command)
if re == True:
print ("登陆成功!")
File_transfer(s)
elif re == False:
print ("您的输入有误,请重新输入!")
Login(s)
else:
print ("与服务器连接出现异常!") def Register(s):
"""
用户注册
:param s:
:return:
"""
name = raw_input("请输入你的用户名:")
password = raw_input("请输入你的密码:")
Password = raw_input("请再次输入密码:")
if password != Password:
print ("你的密码两次输入不一致,请重新输入!")
Register(s)
command = 'register' + ' ' + name + ',' + password
print (command)
re = Confirm(s,command)
if re == True:
File_transfer(s)
elif re == False:
print ("用户名重复,请重新输入!")
Register(s)
else:
print ("与服务器连接出现异常!") def Main(s,log = '未联通主机...'):
"""
用户登陆界面
:param s:
:param log:
:return:
"""
text = """
用户登陆界面 {0} 1,用户登陆
2,用户注册
""".format(log)
print (text)
choose = raw_input("请输入索引进行选择:")
if choose == '':
Login(s)
elif choose == '':
Register(s)
else:
print ("你的选择有误!") if __name__ == "__main__": s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
s.connect((HOST,PORT))
Main(s,s.recv(1024))
except Exception,e:
print "服务器连接不上....",e
finally:
s.close()

从零开始学Python08作业源码:开发简单的FTP(仅供参考)的更多相关文章

  1. 从零开始学Python07作业源码:虚拟人生(仅供参考)

    bin目录: Simulated_life_start.py #!usr/bin/env python # -*- coding:utf-8 -*- # auther:Mr.chen # 描述: im ...

  2. 从零开始学Python08作业思路:开发简单的FTP

    一,作业要求 开发简单的FTP 1,用户登录 2,上传/下载文件 3,不同用户家目录不同 4,查看当前目录下文件 5,充分使用面向对象 二,程序文件清单 Folder目录:用户上传文件家目录 db目录 ...

  3. 从零开始学Python04作业源码:模拟ATM电子银行(仅供参考)

    bin目录:程序启动入口 ATM_start.py: #!/usr/bin/python # -*- coding: utf-8 -*- # 模拟ATM电子银行+登录账户权限控制+管理员管理模块 # ...

  4. 从零开始学Python06作业源码(仅供参考)

    Python Version 2.7x 一,bin目录:程序启动入口 SelectLesson_start.py #!usr/bin/env python # -*- coding:utf-8 -*- ...

  5. 【原创】从零开始学SpagoBI5.X源码汉化编译

    从零开始学SpagoBI5.X源码汉化编译 一.新建Tomact Server 服务器并配置测试1.文件-新建-其他-过滤server-服务类型选择Tomact V7.0 Server2.根据需要修改 ...

  6. 微信JSSDK javascript 开发 代码片段,仅供参考

    最全面最专业的微信公众平台开发教程:http://www.cnblogs.com/txw1958/p/weixin-js-sdk-demo.html 比较完整的分享教程:http://www.cnbl ...

  7. UITableView设置单元格选中后只显示一个打勾的三种简单方法(仅供参考)

    1.第一种方法:先定位到最后一行,若选中最后一行直接退出,否则用递归改变上次选中的状态,重新设置本次选中的状态. - (UITableViewCell*)tableView:(UITableView* ...

  8. 最新咕咆+鲁班+图灵+享学+蚂蚁+硅谷+源码 Java架构师资料《Java架构师VIP课程》

    最新的Java架构师完整资料,完整视频+源码+文档. 每一套都是一百多个G的资料,无密. JAVA架构师全套课程 咕泡学院互联网架构师第一期 咕泡学院互联网架构师第二期 咕泡学院互联网架构师第三期 博 ...

  9. 带货直播源码开发采用MySQL有什么优越性

    MySQL是世界上最流行的开源关系数据库,带货直播源码使用MySQL,可实现分钟级别的数据库部署和弹性扩展,不仅经济实惠,而且稳定可靠,易于运维.云数据库 MySQL 提供备份恢复.监控.容灾.快速扩 ...

随机推荐

  1. imagepool前端图片加载管理器(JavaScript图片连接池)

    前言 imagepool是一款管理图片加载的JS工具,通过imagepool可以控制图片并发加载个数. 对于图片加载,最原始的方式就是直接写个img标签,比如:<img src="图片 ...

  2. 图解C#的值类型,引用类型,栈,堆,ref,out

    C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...

  3. [SDK2.2]Windows Azure Storage (16) 使用WCF服务,将本地图片上传至Azure Storage (上) 客户端代码

    <Windows Azure Platform 系列文章目录> 前一章我们完成了服务器端的代码,并且已经发布到了Windows Azure云端. 本章我们将实现客户端的代码,客户端这里我们 ...

  4. RegSvr32注册OCX时报错

    RegSvr32注册OCX时报错. 错误1: 模块“dsoframer2007.ocx”已加载,但对 DllRegisterServer 的调用失败,错误代码为 0x80070005. 有关此问题的详 ...

  5. Linux下MongoDB服务安装

    Linux下MongoDB服务安装 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个介于关系数据库和非关系数据 ...

  6. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

  7. 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  8. rabbitMQ第五篇:Spring集成RabbitMQ

    前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq. 首先引入配置文件org.springframework.amqp,如下 <dependency> ...

  9. HTML的页面IE注释

    我们常常会在网页的HTML里面看到形如[if lte IE 9]……[endif]的代码,表示的是限定某些浏览器版本才能执行的语句,那么这些判断语句的规则是什么呢?请看下文: <!--[if ! ...

  10. 前端MVVM框架avalon揭秘 - 双向绑定原理

    avalon大家可能不熟悉,但是Knockout估计或多或少听过用过,那么说说KO的几个概念 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Dec ...