此代码在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的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver CS6
视觉化网页开发工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境