python实现类似ftp传输文件的网络程序示例


Posted in Python onApril 08, 2014

此代码在linux上编写,适用于linux,windows下需要更改几个命令。
1、客户端输入IP,端口,可服务器端进行连接,被要求输入用户名和密码进行验证。
2、使用独立的模块来验证登录用户(技术有限,不支持客户端创建用户),用户名:ftpuser  密码:userlogin
2、客户端登录验证成功后,可使用?或者help查看可使用的命令。

ftpserver.py

#!/usr/bin/env python
#-*- coding:utf-8
"Program for ftp server"
from SocketServer import *
from time import *
import os
import loginauth
 
class MyFtp(StreamRequestHandler):
    def handle(self):
        try:
            while True:
                sleep(0.5)
                self.request.sendall('auth')
                name = self.request.recv(BUFSIZ)
                sleep(0.5)
                self.request.sendall('pauth')
                password = self.request.recv(BUFSIZ)
                print name,password
                auth_result = loginauth.user_create(name,password)
                print auth_result
                if auth_result == 0:
                    self.request.sendall('ok2login')
                    break
                elif auth_result == 1:
                    self.request.sendall('fail2login')
                    continue
            while True:
                recv_data = self.request.recv(BUFSIZ).split()
                if recv_data[0] == 'rls':
                    result = os.popen('ls -l ./').read()
                    self.request.sendall(result)
                    continue
                if recv_data[0] == '?' or recv_data[0] == 'help':
                    send_help = '''\033[32;1m
                                ?\help:     Get help.
                                Get:        Downlaod file from remote server.
                                Send:       Send local file to remote server.
                                ls:         List local file.
                                rls:        List remote server file.
                                quit\exit:  Quit the application.
                                \033[0m'''
                    self.request.sendall(send_help)
                    continue
                if recv_data[0] == 'send':
                    filename = recv_data[1]
                    self.request.sendall('ok2send')
                    recv_data = self.request.recv(BUFSIZ)
                    file2w = open(filename,'wb')
                    file2w.write(recv_data)
                    file2w.flush()
                    file2w.close()
                    self.request.sendall('\033[33;1mFile transfer successed!!!\033[0m')
                    continue
                if recv_data[0] == 'get':
                    filename = recv_data[1]
                    if os.path.isfile(filename):
                        self.request.sendall('ok2get')
                        if self.request.recv(BUFSIZ) == 'ok2send':
                            self.request.sendall('sending')
                            sleep(0.5)
                            file_data = open(filename,'rb')
                            file_tmp = file_data.read()
                            self.request.sendall(file_tmp)
                            sleep(1)
                            self.request.sendall('\033[33;1mDownloading complete!\033[0m')
                            file_data.close()
                    else:
                        self.request.sendall('fail2get')
                        if self.request.recv(BUFSIZ) == 'ack':
                            self.request.sendall('\033[31;1m%s not found\033[0m'% filename)
        except :
            pass

if __name__ == '__main__':
    HOST,PORT = '',9889
    ADDR = (HOST,PORT)
    BUFSIZ = 8192
    try:
        server = ThreadingTCPServer(ADDR,MyFtp)
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()

loginauth.py

#!/usr/bin/env python
#-*- coding:utf-8
#Filename:userlogin.py
"Program for userlogin"
import sys,time
import cPickle as pickle
#If it's your first running this program,use USERDB = {}
#If it is not your first running this program,use USERDB = pickle.load(open('userdb','rb'))
USERDB = pickle.load(open('userdb','rb'))
#USERDB = {}
class userdb(object):
    def __init__(self,username,password,time):
        self.username = username
        self.passwd = password
        self.time = time
    def save_user(self):
        USERDB[self.username] = [self.passwd,self.time]
        pickle.dump(USERDB,open('userdb','wb'),True)
    def update_db(self):
        pass
 
def user_create(NAME,PASSWD = ''):
    if NAME in USERDB:
        if PASSWD == USERDB[NAME][0]:
            p = userdb(NAME,PASSWD,time.time())
            p.save_user()
            return 0
        else:
            return 1
    else:
        #p = userdb(NAME,PASSWD,time.time())
        #p.save_user()
        return 1
if __name__ == '__main__':
    user_create(name,password)

ftpclient.py

#!/usr/bin/env python
#-*- coding:utf-8

"Program for ftp client."
from socket import *
from time import sleep
import os

def auth():
    while 1:
        try:
            recv_msg = s.recv(BUFSIZ)
            if recv_msg == 'auth':
                USER = str(raw_input('Please input your username: ')).strip()
                s.sendall(USER)
                if s.recv(BUFSIZ) == 'pauth':
                    PASS = str(raw_input('Please input your password: ')).strip()
                    s.sendall(PASS)
                    recv_msg1 = s.recv(BUFSIZ)
                    if recv_msg1 == 'ok2login':
                        print '\033[33;1mlogin success!!!\033[0m'
                        break
                    elif  recv_msg1 == 'fail2login':
                        print '\033[33;1mlogin failure!!!\033[0m'
                        continue
                    else:
                        continue
        except:
            return 'error'
def switch():
    while True:
        INPUT = str(raw_input('ftp> ')).strip()
        if len(INPUT) == 0:continue
        elif INPUT == 'quit' or INPUT == 'exit':
            s.close()
            break
        elif INPUT == '?' or INPUT == 'help':
            s.send(INPUT)
            recv_data = s.recv(BUFSIZ)
            print recv_data
            continue
        elif INPUT == 'get' or INPUT == 'send':
            print '\033[31;1mYou must specified filename!!\033[0m'
            continue
        elif INPUT == 'ls':
            cmd = os.popen('ls -l ./').read()
            print cmd
            continue
        elif INPUT == 'rls':
            s.send(INPUT)
            recv_data = s.recv(BUFSIZ)
            print recv_data
            continue
        elif INPUT.split()[0] == 'send':
            filename = INPUT.split()[1]
            if os.path.isfile(filename):
                print 'Sending %s......'% filename
                s.sendall(INPUT)
                re_data = s.recv(BUFSIZ)
                if re_data == 'ok2send':
                    file_data = open(filename,'rb')
                    file_tmp = file_data.read()
                    file_data.close()
                    s.sendall(file_tmp)
                    sleep(0.5)
                    recv_data = s.recv(BUFSIZ)
                    print recv_data
                    continue
                else:continue
            else:
                print '\033[31;1m%s not found!\033[0m'% filename
        elif INPUT.split()[0] == 'get':
            filename = INPUT.split()[1]
            s.sendall(INPUT)
            msg1 = s.recv(BUFSIZ)
            if msg1 == 'ok2get':
                s.sendall('ok2send')
                msg2 = s.recv(BUFSIZ)
                if msg2 == 'sending':
                    file_data = s.recv(BUFSIZ)
                    file2w = open(filename,'wb')
                    file2w.write(file_data)
                    file2w.flush()
                    file2w.close()
                    msg3 = s.recv(BUFSIZ)
                    print msg3
                    continue
            elif msg1 == 'fail2get':
                s.send('ack')
                msg4 = s.recv(BUFSIZ)
                print msg4
                continue
        else:
            continue

if __name__ == '__main__':
    #Default 127.0.0.1
    HOST = str(raw_input('Server IP: ')).strip()
    #Defautl 9889
    PORT = int(raw_input('Server PORT: '))
    ADDR = (HOST,PORT)
    BUFSIZ = 8192
    s = socket(AF_INET,SOCK_STREAM)
    try:
        s.connect(ADDR)
    except :
        pass
    if auth() == 'error':
        print 'Connection refused.'
    else:
        switch()
Python 相关文章推荐
Python Web框架Pylons中使用MongoDB的例子
Dec 03 Python
python  Django中的apps.py的目的是什么
Oct 15 Python
python开发之anaconda以及win7下安装gensim的方法
Jul 05 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
Aug 22 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 Python
Python pygame绘制文字制作滚动文字过程解析
Dec 12 Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
python转化excel数字日期为标准日期操作
Jul 14 Python
浅谈Python爬虫原理与数据抓取
Jul 21 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 Python
Python多线程 Queue 模块常见用法
Jul 04 Python
Python collections模块实例讲解
Apr 07 #Python
python操作xml文件示例
Apr 07 #Python
python生成随机验证码(中文验证码)示例
Apr 03 #Python
python读取html中指定元素生成excle文件示例
Apr 03 #Python
python实现zencart产品数据导入到magento(python导入数据)
Apr 03 #Python
python模拟登陆阿里妈妈生成商品推广链接
Apr 03 #Python
python多线程抓取天涯帖子内容示例
Apr 03 #Python
You might like
php+mysql写的简单留言本实例代码
2008/07/25 PHP
php猜单词游戏
2015/09/29 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
javascript的BOM
2016/05/03 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
2018/08/08 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
详解Python中的多线程编程
2015/04/09 Python
Python使用matplotlib填充图形指定区域代码示例
2018/01/16 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
Python类的动态绑定实现原理
2020/03/21 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
HTML文本属性&颜色控制属性的实现
2019/12/17 HTML / CSS
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
中医专业应届生求职信
2013/11/17 职场文书
管理站站长岗位职责
2013/11/27 职场文书
主持人婚宴答谢词
2014/01/28 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
营销计划书范文
2015/01/17 职场文书
公司市场部岗位职责
2015/04/15 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python