python客户端与服务器端_Python实现的FTP通信客户端与服务器端功能示例
本文实例讲述了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客户端与服务器端_Python实现的FTP通信客户端与服务器端功能示例相关推荐
- python 输入文件名查找_Python实现的根据文件名查找数据文件功能示例
本文实例讲述了Python实现的根据文件名查找数据文件功能.分享给大家供大家参考,具体如下: #-*- coding: UTF-8 -*- import os import shutil AllFil ...
- python 调整灰度图像对比度_Python实现PS图像调整之对比度调整功能示例
本文实例讲述了Python实现PS图像调整之对比度调整功能.分享给大家供大家参考,具体如下: 这里用 Python 实现 PS 里的图像调整–对比度调整.具体的算法原理如下: (1).nRGB = R ...
- python线程同步锁_Python实现的多线程同步与互斥锁功能示例
本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading i ...
- python进程间通信时间开销_python 进程间的通信
python3,进程间的通信 本文来源于python 3.5版本的官方文档 multiprocessing模块为进程间通信提供了两种方法: 1.进程队列queue The Queue class is ...
- python 获取键盘输入、同时有超时的功能_python 获取键盘输入,同时有超时的功能示例...
如下所示: ''' ###get keyboard input and timeout =5 import sys, time, msvcrt def readInput( caption, defa ...
- python查找文件名_Python实现的根据文件名查找数据文件功能示例
这篇文章主要介绍了Python实现的根据文件名查找数据文件功能,涉及Python针对文件与目录的遍历.查询等相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python实现的根据文件名查找数据文件功 ...
- python更改图片中物体的颜色_Python实现去除图片中指定颜色的像素功能示例
Python实现去除图片中指定颜色的像素功能示例 本文实例讲述了Python实现去除图片中指定颜色的像素功能.分享给大家供大家参考,具体如下: 这里用python去除图片白色像素 需要python和p ...
- python画螺旋状图形教程_Python实现的绘制三维双螺旋线图形功能示例
本文实例讲述了Python实现的绘制三维双螺旋线图形功能.分享给大家供大家参考,具体如下: 代码: # -*- coding:utf-8 -*- #! python3 #绘制三维双螺旋线 import ...
- python定时下载链接_python定时下载FTP指定文件
公司正好有个需求,定期从远端ftp下载指定昨天的数据,写了2个函数,一个是连接远端ftp,另一个是定期下载远端数据,用到了ftplib.datetime和正则re三个模块 1.ftplib:连接和下载 ...
最新文章
- python打印表情
- pil ImportError: DLL load failed: 找不到指定的模块
- 小米4硬改教程_小米手环3美化/修改资源包教程(含加入二维码教程)
- c# 拷贝结构体_C#学习之Partial、结构体、枚举
- 解决ubuntu中连接mysql时报错:Access denied for user ‘root‘@‘localhost‘
- 重磅!微软发布新一代 Teams 开发工具 —— Teams Toolkit!不止VS Code extension!
- Oracle自动性能统计
- Dummary、Fake、Stub、Spy、Mock
- python浪漫代码表白npy_python实现npy格式文件转换为txt文件操作
- java18.取球游戏,12种球类游戏,想怎么玩就怎么玩!
- python查询12306余票_python命令行查询12306火车票
- 荣耀 android 11 rom,华为荣耀畅玩4/4X CM11 七版通刷
- Cocos Creator入职学习日记——篇1(KeyWord:艺术字、渐变色、透明过渡特效)
- Python笔记:query查询
- rt-thread通过spi连接W25Q32后无法读取ID
- Java——entity(实体类)的写法规范
- 业精于勤,荒于嬉;行成于思,毁于随
- Flash CS4 过期了
- iVI 4 Video Converter for Mac(mac视频转换器)
- 无线网桥有服务器吗,无线网桥的三种用法
热门文章
- 4g内存电脑装xp系统怎么样_系统坏了?去店了重装系统又贵?今天手把手教你如何重装系统...
- 姓名的首字母组成的图案C语言怎么编,c语言编写一个程序,根据用户输入英文名和姓先显示姓氏,其后跟一个逗号,然后显示名的首字母:...
- docker compose安装_docker stack,docker-compose前世今生
- explain和profiling分析查询SQL时间
- Hibernate SQL 方言(hibernate.dialect)
- 【转】android内存溢出的解决方法
- asp.net引入一个js文件名为JScript的js脚本 报错 缺少对象
- Balder 3D开发系列之--给自定义基本体进行贴图操作
- Eclipse+CDT+MinGW 配置 C/C++ 开发环境
- 三种前端手机开发(uni-app、vant、mui)