手机
当前位置:查字典教程网 >脚本专栏 >python >python实现类似ftp传输文件的网络程序示例
python实现类似ftp传输文件的网络程序示例
摘要:此代码在linux上编写,适用于linux,windows下需要更改几个命令。1、客户端输入IP,端口,可服务器端进行连接,被要求输入用户名...

此代码在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 = '''33[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.

quitexit: Quit the application.

33[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('33[33;1mFile transfer successed!!!33[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('33[33;1mDownloading complete!33[0m')

file_data.close()

else:

self.request.sendall('fail2get')

if self.request.recv(BUFSIZ) == 'ack':

self.request.sendall('33[31;1m%s not found33[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 '33[33;1mlogin success!!!33[0m'

break

elif recv_msg1 == 'fail2login':

print '33[33;1mlogin failure!!!33[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 '33[31;1mYou must specified filename!!33[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 '33[31;1m%s not found!33[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传输文件的网络程序示例】相关文章:

python实现360皮肤按钮控件示例

Python的print用法示例

python使用循环实现批量创建文件夹示例

python中mechanize库的简单使用示例

python实现图片批量剪切示例

python文件比较示例分享

python处理中文编码和判断编码示例

python 实现归并排序算法

python读取html中指定元素生成excle文件示例

python实现2014火车票查询代码分享

精品推荐
分类导航