支持多用户在线的Ftp程序

一、要求

二、思路

三、代码

服务器端:

# #!/usr/bin/env python
# # -*- coding: utf-8 -*-
import sys
import time
import  socket
import hashlib
import pickle
import subprocess
import socketserver

class Myserver(socketserver.BaseRequestHandler):

    def recv_file(self):
        conn=self.request
        file_size=int(str(conn.recv(1024),encoding=‘utf-8‘))
        print(file_size)
        conn.sendall(bytes(‘welcome‘,encoding=‘utf-8‘))
        has_recv=0
        with open(‘new.png‘,‘wb‘) as f:
            while has_recv<=file_size:
                data=conn.recv(10240)
                f.write(data)
                has_recv+=len(data)

    def command(self):
        conn=self.request
        a=conn.recv(1024)
        ret=str(a,encoding=‘utf-8‘)
        ret2 = subprocess.check_output(ret, shell=True)
        conn.sendall(ret2)

    def md5(self,pwd):
        hash=hashlib.md5(bytes(‘xx7‘,encoding=‘utf-8‘))
        hash.update(bytes(pwd,encoding=‘utf-8‘))
        return hash.hexdigest()

    def login(self,usrname,pwd):
        conn=self.request
        s=pickle.load(open(‘name_pwd‘,‘rb‘))
        if usrname in s:
             if s[usrname]==self.md5(pwd):        #和加密后的密码进行比较
                return True
             else:
                return False
        else:
            return False

    def regist(self,usrname,pwd):
        conn=self.request
        s=pickle.load(open(‘name_pwd‘,‘rb‘))
        if usrname in s:
             return False
        else:
            s[usrname]=self.md5(pwd)
            pickle.dump(s,open(‘name_pwd‘,‘wb‘))
            return True

    def before(self):
        conn=self.request
        b=conn.recv(1024)
        ret=str(b,encoding=‘utf-8‘)
        print(ret)
        conn.sendall(bytes(‘b ok‘,encoding=‘utf-8‘))
        c=conn.recv(1024)
        r=str(c,encoding=‘utf-8‘)
        usrname,pwd=r.split(‘,‘)
        if ret==‘1‘:
            r=self.login(usrname,pwd)
            if r:
                conn.sendall(bytes(‘y‘,encoding=‘utf-8‘))
            else:
                conn.sendall(bytes(‘n‘,encoding=‘utf-8‘))
        elif ret==‘2‘:
            # print(usrname,pwd)
            r=self.regist(usrname,pwd)
            if r:
                conn.sendall(bytes(‘y‘,encoding=‘utf-8‘))
            else:
                conn.sendall(bytes(‘n‘,encoding=‘utf-8‘))

    def handle(self):
        conn=self.request
        conn.sendall(bytes(‘welcome‘,encoding=‘utf-8‘))

        self.before() #登陆或注册验证

        while True:
            a=conn.recv(1024)
            conn.sendall(bytes(‘收到a‘,encoding=‘utf-8‘))
            ret=str(a,encoding=‘utf-8‘)
            if ret==‘1‘:
                self.recv_file()
                # conn.sendall(bytes(‘file ok‘,encoding=‘utf-8‘))
            elif ret==‘2‘:
                self.command()
            elif ret==‘q‘:
                break
            else:
                pass

if __name__==‘__main__‘:
    sever=socketserver.ThreadingTCPServer((‘127.0.0.1‘,9999),Myserver)
    sever.serve_forever()

  客户端:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import time
import os
import  socket

def send_file(file_path):
    size=os.stat(file_path).st_size
    obj.sendall(bytes(str(size),encoding=‘utf-8‘))
    obj.recv(1024)
    has_send=0
    with open(‘f.png‘,‘rb‘) as f:
        for line in f:
            obj.sendall(line)
            has_send+=len(line)
            sys.stdout.write(‘\r‘)  #清空文件内容
            time.sleep(0.2)
            sys.stdout.write(‘已发送%s%%|%s‘ %(int(has_send/size*100),(round(has_send/size*40)*‘★‘)))
            sys.stdout.flush()   #强制刷出内存
        print(‘\n‘)

def command(command_name):
    obj.sendall(bytes(command_name,encoding=‘utf-8‘))
    ret=obj.recv(10240)  #等待客户端发送
    r=str(ret,encoding=‘GBK‘)
    print(r)

def login(usrname,pwd):
    obj.sendall(bytes(usrname+‘,‘+pwd,encoding=‘utf-8‘))
    ret=obj.recv(1024)
    r=str(ret,encoding=‘utf-8‘)
    if r==‘y‘:
        return 1
    else:
        return 0

def regist(usrname,pwd):
    obj.sendall(bytes(usrname+‘,‘+pwd,encoding=‘utf-8‘))
    ret=obj.recv(1024)
    r=str(ret,encoding=‘utf-8‘)
    if r==‘y‘:
        return 1
    else:
        return 0
def before():
    usrname=input(‘请输入用户名‘)
    pwd=input(‘请输入密码‘)
    a=input(‘请选择1.登陆 2.注册‘)
    obj.sendall(bytes(a,encoding=‘utf-8‘))
    obj.recv(1024)
    if a==‘1‘:
        ret=login(usrname,pwd)
        if ret:
            print(‘登陆成功‘)
            return 1
        else:
            print(‘用户名或密码错误‘)
            return 0
    elif a==‘2‘:
        ret=regist(usrname,pwd)
        if ret:
            print(‘注册成功‘)
            return 1
        else:
            print(‘用户名已存在‘)
            return 0

obj=socket.socket()
obj.connect((‘127.0.0.1‘,9999))

ret=obj.recv(1024)  #等待客户端发送
r=str(ret,encoding=‘utf-8‘)
print(r)

result=before()#登陆或注册
if result:
    while True:
        a=input(‘请选择1.传文件 2.执行命令 q退出:‘)
        obj.sendall(bytes(str(a),encoding=‘utf-8‘))
        ret=obj.recv(1024) #确认是否收到a
        r=str(ret,encoding=‘utf-8‘)
        print(r)
        if a==‘1‘:
            # b=input(‘请输入文件路径:‘)
            b=‘f.png‘
            if os.path.exists(b):
                send_file(b)
                obj.sendall(bytes(‘hhe‘,encoding=‘utf-8‘))
                # obj.recv(1024)
        elif a==‘2‘:
            b=input(‘请输入command:‘)
            command(b)
        elif a==‘q‘:
            break
        else:
            print(‘输入错误‘)

obj.close()

  

时间: 2024-11-05 10:36:34

支持多用户在线的Ftp程序的相关文章

Python开发程序:支持多用户在线的FTP程序

作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 允许用户查看当前目录下文件 允许上传和下载文件,保证文件一致性 文件传输过程中显示进度条 附加功能:支持文件的断点续传(仅下载) 程序 1.最最重要的readme: ### 作者介绍: * author:lzl ### 博客地址: * http://www.cnblogs.c

开发一个支持多用户在线的FTP程序

一,项目题目:开发一个支持多用户在线的FTP程序 二,项目要求: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 6.允许用户查看当前目录下文件 7.允许上传和下载文件,保证文件一致性(md5) 8.文件传输过程中显示进度条 9.附加功能:支持文件的断点续传 三,注意事项: 基本要求. 完成1,2,3,5,6,7,8 实力选手. 完成 上条 及需求4

【小程序】支持多用户在线的FTP程序

功能:1.用户加密认证: 2.允许同时多用户登陆: 3.每个用户有自己的家目录,并且只能访问在自己的家目录: 4.对用户进行磁盘配额,每个用户的可用空间不同: 5.允许用户在ftp server上随意切换目录: 6.允许用户查看当前目录上下文: 7.允许用户上传和下载文件,保证文件的一致性 8.文件传输过程中显示进度条: 客户端: # Author:q1.ang import socket,os,json import hashlib import sys class FtpClient(obj

python 开发一个支持多用户在线的FTP

### 作者介绍:* author:lzl### 博客地址:* http://www.cnblogs.com/lianzhilei/p/5813986.html### 功能实现 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 允许用户查看当前目录下文件 允许上传和下载文件,保证文件一致性 文件传输过程中显示进度条 附加功能

python 多用户在线的FTP程序

要求: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 6.允许用户查看当前目录下文件 7.允许上传和下载文件,保证文件一致性 8.文件传输过程中显示进度条 9.附加功能:支持文件的断点续传 README: 设计说明 1.client连接server端需要验证账号密码,密码使用MD5加密传输. 2.用户信息保存在本地文件中,密码MD5加密存储.磁盘配额

python之FTP程序(支持多用户在线)

转发注明出处:http://www.cnblogs.com/0zcl/p/6259128.html,这次博客写了很久~~ 一.需求 1. 用户加密认证 (完成)2. 允许同时多用户登录 (完成)3. 每个用户有自己的家目录 ,且只能访问自己的家目录(完成)4. 对用户进行磁盘配额,每个用户的可用空间不同(完成)5. 允许用户在ftp server上随意切换目录cd(完成)6. 允许用户查看当前目录下文件ls(完成)7. 允许上传put和下载get文件(完成),保证文件一致性(此需求不做)8. 文

FTP程序

需求:开发一个支持多用户同时在线的FTP程序 要求:1.用户加密认证2.允许同时多用户登录(用到并发编程的知识,选做)3.每个用户有自己的家目录,且只能访问自己的家目录4.对用户进行磁盘配额,每个用户的可用空间不同(选做)5.允许用户在ftp server上随意切换目录6.允许用户查看当前目录下的文件7.允许上传和下载文件,并保证文件的一致性8.文件传输过程中显示进度条9.附加:支持文件的断点续传(选做)开发的程序需符合PEP8开发规范,及专业的生产软件设计规范,包括目录.代码命名.功能接口等

yunBT:一个基于TP3.1的多用户BT离线下载程序,支持在线播放

说明:yunBT这个项目其实很早就有了,只是老没更新,现在作者基于ThinkCMS重做该程序,支持多用户注册下载,Magnet和HTTP下载.每个单独用户支持10个任务,默认下载文件最大为10GB,可以在后台修改.下载完成后用户可以直接查看下载的文件仅支持mp4文件在线播放.管理员可以添加用户的下载量及查看管理下载任务. 由于该程序刚出来,功能较少,暂不支持下载工具下载,可以在浏览器中下载,后续将添加,而且作者计划以后会增加分享功能.用户转码功能.积分功能.邀请功能.工具下载.使用Onedriv

第五十六节,python实现支持并发、断点续传的Ftp程序

一.要求 1.用户md5认证 2.支持多用户同时登陆(并发) 3.进入用户的命令行模式,支持cd切换目录,ls查看目录子文件 4.执行命令(ipconfig) 5.传输文件: a.支持断点续传 b.传输中显示进度条 二.思路 1.客户端用户登录和注册: a.客户端仅提供用户名和密码,选择登录或注册,b.服务器端进行注册并将加密后的密码写入文件,最后返回给客户端是否登录或注册成功 2.ls和cd命令 a.客户端输入命令,服务器端处理并返回给客户端 3.执行命令: a.客户端发送需要执行的命令b.服