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实现类似ftp传输文件的网络程序示例
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@