• 服务器端: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. 将word文档A表格中的内容拷贝到word文档B表格中

    Function IsFileExists(ByVal strFileName As String) As Boolean ) <> Empty Then IsFileExists = T ...

  2. 使用WCF的Trace与Message Log功能

      原创地址:http://www.cnblogs.com/jfzhu/p/4030008.html 转载请注明出处   前面介绍过如何创建一个WCF Service http://www.cnblo ...

  3. MongoDB 聚合操作

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  4. 【转】C#语言之“string格式的日期时间字符串转为DateTime类型”的方法

    方法一:Convert.ToDateTime(string) string格式有要求,必须是yyyy-MM-dd hh:mm:ss ================================== ...

  5. ASP.NET MVC5 网站开发实践 - 概述

    前段时间一直在用MVC4写个网站开发的demo,由于刚开始学所有的代码都写在一个项目中,越写越混乱,到后来有些代码自己都理不清了.1月26日晚上在群里跟@怒放 他们讨论这个问题,结论是即使只是一个小d ...

  6. poj 3630 Phone List

    #include<iostream> #include<cstdio> #include<cstring> #define N 100005 using names ...

  7. 【原创】开源.NET排列组合组件KwCombinatorics使用(一)—组合生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  8. 搞清arguments,callee,caller

    arguments是什么? arguments是函数调用时,创建的一个类似的数组但又不是数组的对象,并且它存储的是实际传递给函数的参数,并不局限于函数声明的参数列表哦. 尼玛,什么意思? 写个demo ...

  9. 跨语言和跨编译器的那些坑(CPython vs IronPython)

    代码是宝贵的,世界上最郁闷的事情,便是写好的代码,还要在另外的平台上重写一次,或是同时维护功能相同的两套代码.所以才需要跨平台. 不仅如此,比如有人会吐槽Python的原生解释器CPython跑得太慢 ...

  10. Linux笔记之——Linux关机命令详解(转)

    原文连接:http://www.jb51.net/os/RedHat/1334.html 在linux下一些常用的关机/重启命令有shutdown.halt.reboot.及init,它们都可以达到重 ...