服务器模型
基本的服务器模型:
并发:1、循环
2、并发模式
3、IO多路复用
循环:1、单线程程序;
2、循环接收连接或者请求,然后处理;处理后继续循环
循环服务器模型缺点:不能同时处理多个客户端的并行,不允许某个客户端长期占有服务器
优点:结构比较简单,使用于UDP程序,要求处理请求可以快速完成
IO多路复用模型:通过同时监控多个IO,来达到IO并发的目的。
缺点;单线程,不能长期阻塞;不适合处理大量cup占有高的程序
优点;开销小,比较适合IO密集型的服务端程序
并行服务器:每当有一个客户端连接请求时,就创建一个新的进程或者线程,处理客户端的 请求,而主进程/主线程可以继续接受其他客户端的连接。
缺点:资源消耗比较大
优点:使用客户端需要长期占有服务器的情况
基于fork的多进程并发
1、创建套接字 绑定 监听
2、接受客户端请求
3、创建子进程,处理客户端请求,父进程继续准备接受新的客户端连接
4、客户端退出,销毁相应的子进程
from socket import * import os,sys import signal #创建套接字 HOST='' PORT=8888 def client_handler(c): try: print("子进程接收客户的请求",c.getpeername()) while True: data=c.recv(1024).decode() if not data: break print(data) c.send(b"receive your message") except(KeyboardInterrupt,SystemExit): raise except Exception as e: print(e) c.close() sys.exit(0)#结束子进程 s=socket() s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) s.bind((HOST,PORT)) s.listen(5) print("父进程%d等待客户端链接"%os.getpid()) while True: try: c,addr=s.accept() except KeyboardInterrupt: raise except Exception as e: print(e) continue #为新的客户端创建进程,处理僵尸进程 signal.signal(signal.SIGCHLD,signal.SIG_IGN) pid=os.fork() if pid<0: print("creating failuer") c.close() continue elif pid==0: s.close() #处理客户端请求 client_handler(c) else: c.close() continue