python学习-socket网络编程
作业:多用户在线的FTP程序
要求:
- 用户加密认证
- 允许同时多用户登录
- 每个用户有自己的家目录 ,且只能访问自己的家目录
- 对用户进行磁盘配额,每个用户的可用空间不同
- 允许用户在ftp server上随意切换目录
- 允许用户查看当前目录下文件
- 允许上传和下载文件,保证文件一致性
- 文件传输过程中显示进度条
- 附加功能:支持文件的断点续传(仅下载)
README
### 功能实现 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 允许用户查看当前目录下文件 允许上传和下载文件,保证文件一致性 文件传输过程中显示进度条 附加功能:支持文件的断点续传 ### 目录结构: FTP │ ├── ftpclient #客户端程序 │ ├── __init__.py │ └── ftpclient.py #客户端主程序 └── ftpserver #服务端程序 ├── README.txt ├── ftpserver.py #服务端入口程序 ├── conf #配置文件目录 │ ├── __init__.py │ └── setting.py ├── modules #程序核心目录 │ ├── __init__.py │ ├── auth_user.py #用户认证模块 │ └── sokect_server.py #sokectserver模块 ├── database #用户数据库 │ ├── alex.db │ ├── lzl.db │ └── eric.db ├── home #用户宿主目录 │ ├── alex │ ├── lzl │ └── eric └── log ├── __init__.py └── log #待扩展.... ### 功能实现 1、conf目录下settings.py模块记录可操作用户信息,根据用户信息生成用户字典和宿主目录,已经生成的不再新建 2、每个用户的宿主目录磁盘空间配额默认为10M,可在settings.py模块里进行修改 3、程序运行在windows系统上,程序要求全部实现,下面是具体命令操作 4、切换目录:cd .. 返回上一级目录 cd dirname 进入dirname 用户登录后默认进入宿主目录,只可在宿主目录下随意切换 5、创建目录:mkdir dirname 在当前目录下创建目录,如果目录存在则报错,不存在创建 6、查看当前路径: pwd 7、查看当前路径下的文件名和目录名: dir 8、下载文件(可续传):get filename ①、服务端当前目录存在此文件,客户端不存在此文件,直接下载 ②、服务端当前目录存在此文件,客户端存在此文件名,之前下载中断,文件可续传,进行续传 ③、服务端当前目录存在此文件,客户端存在此文件名,大小与服务端一致,不下载 9、上传文件:put filename 判断宿主目录磁盘空间是否够用,可以,上传文件;否则,报错 ### 状态码 400 用户认证失败 401 命令不正确 402 文件不存在 403 创建文件已经存在 404 磁盘空间不够 405 不续传 200 用户认证成功 201 命令可以执行 202 磁盘空间够用 203 文件具有一致性 205 续传 000 系统交互码 别人家的作业:http://www.cnblogs.com/lianzhilei/p/5869205.html
ftp客户端
ftp服务端
conf配置文件
database用户数据库(系统初始化自动生成)
modules目录
一、运行原理
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
socket()模块函数用法:
1 import socket 2 socket.socket(socket_family,socket_type,protocal=0) 3 socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。 4 5 获取tcp/ip套接字 6 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 7 8 获取udp/ip套接字 9 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 10 11 由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。 12 例如tcpSock = socket(AF_INET, SOCK_STREAM)