python实现类似ftp传输文件的网络程序示例
admin
2023-07-31 02:06:57
0

此代码在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()

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...