python实现ftp文件传输_python实现类似ftp传输文件的网络程序示例

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值