• 服务器端: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. MySQL COLUMNS分区

    200 ? "200px" : this.width)!important;} --> 介绍 COLUMN分区是5.5开始引入的分区功能,只有RANGE COLUMN和LIS ...

  2. SQL Server 使用全文索引进行页面搜索

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/全文索引 概述 全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询.全文索引将有关重要的词及其位置的信息存储 ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...

  4. [笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...

  5. Java集合类的组织结构和继承、实现关系

    Collection继承.实现关系如下(说明(I)表示接口,(C)表示Java类,<--表示继承,<<--表示实现): (I)Iterable |<--(I)Collectio ...

  6. Java 循环中标签的作用

    continue和break可以改变循环的执行流程,但在多重循环中,这两条语句无法直接从内层循环跳转到外层循环.在C语言中,可以通过goto语句实现多重循环的跳转,但在非循环结构中使用goto语句会使 ...

  7. SQL Server中的高可用性(1)----高可用性概览

        自从SQL Server 2005以来,微软已经提供了多种高可用性技术来减少宕机时间和增加对业务数据的保护,而随着SQL Server 2008,SQL Server 2008 R2,SQL ...

  8. Select count(*)和Count(1)的区别和执行方式

        在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数.很多人其实对这三者之间是区分不清的.本文会阐述这三者的作用,关系以及背后的原理.   ...

  9. [C#]想说一说嵌套数组

    今天早上,随感而发,随便写了点东西.结果下午的时候看了看评论,吓我一跳.估计是不是写代码的人看散文看得太少了,还是因为现在的人读的书太少了,似乎有有些大惊小怪. 关于Y美女,我声明一下,尽管她很脱俗, ...

  10. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用: