本文实例讲述了Python实现的FTP通信客户端与服务器端功能。分享给大家供大家参考,具体如下:
一 代码
1、服务端代码
import socket
import threading
import os
import struct
#用户账号、密码、主目录
#也可以把这些信息存放到数据库中
users = {'zhangsan':{'pwd':'zhangsan1234', 'home':r'c:\python 3.5'},
'lisi':{'pwd':'lisi567', 'home':'c:\\'}}
def server(conn,addr, home):
print('新客户端:'+str(addr))
#进入当前用户主目录
os.chdir(home)
while True:
data = conn.recv(100).decode().lower()
#显示客户端输入的每一条命令
print(data)
#客户端退出
if data in ('quit', 'q'):
break
#查看当前文件夹的文件列表
elif data in ('list', 'ls', 'dir'):
files = str(os.listdir(os.getcwd()))
files = files.encode()
conn.send(struct.pack('I', len(files)))
conn.send(files)
#切换至上一级目录
elif ''.join(data.split()) == 'cd..':
cwd = os.getcwd()
newCwd = cwd[:cwd.rindex('\\')]
#考虑根目录的情况
if newCwd[-1] == ':':
newCwd += '\\'
#限定用户主目录
if newCwd.lower().startswith(home):
os.chdir(newCwd)
conn.send(b'ok')
else:
conn.send(b'error')
#查看当前目录
elif data in ('cwd', 'cd'):
conn.send(str(os.getcwd()).encode())
elif data.startswith('cd '):
#指定最大分隔次数,考虑目标文件夹带有空格的情况
#只允许使用相对路径进行跳转
data = data.split(maxsplit=1)
if len(data) == 2 and os.path.isdir(data[1]) and data[1]!=os.path.abspath(data[1]):
os.chdir(data[1])
conn.send(b'ok')
else:
conn.send(b'error')
#下载文件
elif data.startswith('get '):
data = data.split(maxsplit=1)
#检查文件是否存在
if len(data) == 2 and os.path.isfile(data[1]):
conn.send(b'ok')
fp = open(data[1], 'rb')
while True:
content = fp.read(4096)
#发送文件结束
if not content:
conn.send(b'overxxxx')
break
#发送文件内容
conn.send(content)
if conn.recv(10) == b'ok':
continue
fp.close()
else:
conn.send(b'no')
#无效命令
else:
pass
conn.close()
print(str(addr)+'关闭连接')
#创建Socket,监听本地端口,等待客户端连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 10600))
sock.listen(5)
while True:
conn, addr = sock.accept()
#验证客户端输入的用户名和密码是否正确
userId, userPwd = conn.recv(1024).decode().split(',')
if userId in users and users[userId]['pwd'] == userPwd:
conn.send(b'ok')
#为每个客户端连接创建并启动一个线程,参数为连接、客户端地址、客户主目录
home = users[userId]['home']
t = threading.Thread(target=server, args=(conn,addr,home))
t.daemon = True
t.start()
else:
conn.send(b'error')
2、客户端代码
import socket
import sys
import re
import struct
import getpass
def main(serverIP):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((serverIP, 10600))
userId = input('请输入用户名:')
#使用getpass模块的getpass()方法获取密码,不回显
userPwd = getpass.getpass('请输入密码:')
message = userId+','+userPwd
sock.send(message.encode())
login = sock.recv(100)
#验证是否登录成功
if login == b'error':
print('用户名或密码错误')
return
#整数编码大小
intSize = struct.calcsize('I')
while True:
#接收客户端命令,其中##>是提示符
command = input('##> ').lower().strip()
#没有输入任何有效字符,提前进入下一次循环,等待用户继续输入
if not command:
continue
#向服务端发送命令
command = ' '.join(command.split())
sock.send(command.encode())
#退出
if command in ('quit', 'q'):
break
#查看文件列表
elif command in ('list', 'ls', 'dir'):
loc_size = struct.unpack('I', sock.recv(intSize))[0]
files = eval(sock.recv(loc_size).decode())
for item in files:
print(item)
#切换至上一级目录
elif ''.join(command.split()) == 'cd..':
print(sock.recv(100).decode())
#查看当前工作目录
elif command in ('cwd', 'cd'):
print(sock.recv(1024).decode())
#切换至子文件夹
elif command.startswith('cd '):
print(sock.recv(100).decode())
#从服务器下载文件
elif command.startswith('get '):
isFileExist = sock.recv(20)
#文件不存在
if isFileExist != b'ok':
print('error')
#文件存在,开始下载
else:
print('downloading.', end='')
fp = open(command.split()[1], 'wb')
while True:
print('.', end='')
data = sock.recv(4096)
if data == b'overxxxx':
break
fp.write(data)
sock.send(b'ok')
fp.close()
print('ok')
#无效命令
else:
print('无效命令')
sock.close()
if __name__ == '__main__':
if len(sys.argv) != 2:
print('Usage:{0} serverIPAddress'.format(sys.argv[0]))
exit()
serverIP = sys.argv[1]
if re.match(r'^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$', serverIP):
main(serverIP)
else:
print('服务器地址不合法')
exit()
二 运行结果
客户端运行结果
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python Socket编程技巧总结》、《Python URL操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“Python实现的FTP通信客户端与服务器端功能示例”评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新动态
2025年10月30日
2025年10月30日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]
