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