服务器模型
硬件服务器 | 主机 集群 | |
厂商 | IBM HP 联想 浪潮 | |
软件服务器 | 编写的服务器运行,依托于硬件服务器运行,提供给用户一定的软件服务 | |
软件服务器 分类 | webserver ---- > 网站后端程序提供网站请求的后端处理和响应 | |
httpserever ---- > 处理HTTP请求,回复http响应 | ||
邮箱服务器 ----- > 处理邮件 | ||
文件服务器 ----- > 处理文件传输 | ||
功能 | 网络连接,逻辑处理,数据的交互,数据的传输,协议的实现 | |
模型结构 | c/s (客户端服务器模型) | |
b/s (游览器服务器模型) | ||
服务器目标 | 处理速度快、 数据更安全、 并发量大 | |
硬件 | 更高的配置,集成分布基础,更好的网路速度,更加主机,更好的网路安全性 | |
软件 | 程序占有更少的资源,更稳定的运行效果,更流畅的运行速度,采用更安全更合适的技术 |
基础的服务器
循环服务器 | 意义 | 单进程程序,循环接受客户端请求,处理请求,每处理完一个请求再去接受下一个请求 | |||
优点 | 实现简单,占有资源少 | ||||
缺点 | 无法同时连接多个客户端,当一个客户端长期占有服务器时,形成其它客户端无法操作的情况 | ||||
使用情况 | 任务比较短暂,udp套接字更合适 | ||||
并发服务器 | 意义 | 同时处理多个客户端的任务请求 | |||
1、IO并发 | IO多路复用 协成 | ||||
优点 | 资源消耗少,效率较高,适用于IO类型服务器 | ||||
缺点 | 不能监控cpu密集型程序,本质是单进程所以不能长期阻塞消息的收发,IO的监听 | ||||
2、多进程/多线程并发 | 意义 | 为每一个客户端单独提供一个进程或者线程处理请求。由于进程线程执行独立所以对其它进程不会有影响 | |||
优点 | 客户端可以长期占有服务器,操作不会对其它进程线程产生影响 | ||||
缺点 | 消耗资源较多 | ||||
|
多进程并发
使用步骤 | 使用fork 完成并发
父进程继续等待其他客户单连接
|
示例:见day04/ 1.py
Tftp文件服务器
功能要求 |
|
| |
1) 查看服务器文件库的文件列表(只显示普通文件) 2) 可以将本地文件上传到文件库中 3) 可以将本地文件上传到文件库中 4) 退出 | |
服务器需求 | 1.处理客户端各自请求 |
2.允许多个客户端同时访问操作 | |
|
|
解题思路
- 技术分析
用什么套接字
答:Tcp
需要什么什么服务器模型
答:多进程并发
需要注意的问题
答:粘包 僵尸进程
数据如何传输
答:文件名传输 注意粘包处理
文件传输注意传输结尾
- 设计整体结构
要求封装为类,将功能函数写类中
答:class TFTPServer():
def __inif__()
交互套接字
def do_list()
def do_get()
def do_put()
main() 函数控制整体流程
创建套接字
接受客户端连接
创建子进程
父进程继续等待连接
os.listdir(PATH)
os.path.isfile(): 判断一个文件的类型是否为普通文件
os.path.isdir(): 判断一个文件的类型是否为目录
threading 的多线程并发
每有一个客户端就创建一个新的线程处理客户端请求
对比多进程
优点 : 资源消耗少
缺点 : 需要处理共享资源
注意GIL问题
实现步骤
1. 创建套接字,绑定,监听
2. 接收客户端请求,创建新的线程
3. 主线程继续等待其他客户端连接,分支线程执行客户 端请求
4. 处理完客户端请求后,分支线程退出,关闭客户端套 接字
socket 服务器的继承模块
python2 SocketServer
python3 socketserver
功能 : 通过模块的接口完成基于多进程/多线程 tcp/udp的socket并发程序
'StreamRequestHandler', 处理tcp请求
'DatagramRequestHandler', 处理udp请求
'ForkingMixIn', 建立多进程
'ForkingTCPServer', 建立多进程tcp server
'ForkingUDPServer', 建立多进程udp server
'ThreadingMixIn', 建立多线程
'ThreadingTCPServer', 建立多线程tcp server
'ThreadingUDPServer', 建立多线程udp server
'TCPServer', 建立tcp server
'UDPServer', 建立udp server
基于多线程并发的HTTPServer
1. 接收浏览器的http请求
2. 对请求进行解析
3. 根据解析判断请求内容
4. 将要返回的内容组织http响应格式发送给客户端
升级 :
* 使用多线程并发
* 增加具体请求解析
* 增加数据获取功能
* 封装使用类
技术实现 : threading 并发
tcp socket 传输
HTTP协议响应和请求的格式