Python版单进程、多进程、多线程服务器
来源:互联网 发布:天谕浅粉色头发数据 编辑:程序博客网 时间:2024/06/14 00:24
在学习了Python的网络编程以及计算机网络的相关知识之后,编写了Python版的服务器。有三种实现方式,分别是单进程、多进程、多线程。
实现原理:建立tcp套接字,为该套接字绑定本机信息,之后进入循环,令tcp套接字接收信息,并传递给客户端套接字以及收集客户端地址,然后再次进入循环,服务器套接字不断接收客户端传递进来的信息,判断信息(字符串)长度是否为零,若为0则表示客户端已经关闭。
单进程的较为简单,且不太现实,没有实现意义,但是有助于理解服务器的工作方式。
单进程版如下:
#-*- coding:utf-8 -*-from socket import *#单进程服务器serSocket = socket(AF_INET, SOCK_STREAM)serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)#表示重复利用套接字信息localAddr = ("", 7789)serSocket.bind(localAddr)serSocket.listen(5)while True: print("----主进程,等待客户端连接") newSocket, destAdree = serSocket.accept() print("----主进程,接下来负责数据处理[%s]"%(str(destAdree))) try: while True: revDate = newSocket.recv(1024) if len(revDate) > 0: print("数据是:[%s]"%str(revDate.decode("utf-8"))) else: print("it's nothing") break finally: newSocket.close()serSocket.close()
多进程版如下:
from socket import *from multiprocessing import *from time import sleep# 处理客户端的请求并为其服务def dealWithClient(newSocket,destAddr): while True: recvData = newSocket.recv(1024) if len(recvData)>0: print('recv[%s]:%s'%(str(destAddr), recvData)) else: print('[%s]客户端已经关闭'%str(destAddr)) break newSocket.close()def main(): serSocket = socket(AF_INET, SOCK_STREAM) serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1) localAddr = ('', 7788) serSocket.bind(localAddr) serSocket.listen(5) try: while True: print('-----主进程,,等待新客户端的到来------') newSocket,destAddr = serSocket.accept() print('-----主进程,,接下来创建一个新的进程负责数据处理[%s]-----'%str(destAddr)) client = Process(target=dealWithClient, args=(newSocket,destAddr)) client.start() #因为已经向子进程中copy了一份(引用),并且父进程中这个套接字也没有用处了 #所以关闭 newSocket.close() finally: #当为所有的客户端服务完之后再进行关闭,表示不再接收新的客户端的链接 serSocket.close()if __name__ == '__main__': main()
在编写中要注意循环的写法、位置,以及异常的处理。
多线程版如下:
#-*- coding:utf-8 -*-from socket import *from threading import Thread from time import sleep#多线程服务器def dealwithClient(newSocket, destAddr): while True: newMassage = newSocket.recv(1024) if len(newMassage) > 0: #此处注意不能写成>= print("new massage from [%s] is %s"%(destAddr, newMassage.decode("utf-8"))) else: print("client was closed") break newSocket.close()def main(): serSocket = socket(AF_INET, SOCK_STREAM) serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) localAddr = ('', 7788) serSocket.bind(localAddr) serSocket.listen(5) try: while True: print("---wait for client---") newSocket, destAddr = serSocket.accept() print("---I have accepted a client---") client = Thread(target = dealwithClient, args = (newSocket, destAddr)) client.start() #因为线程中共享这个套接字,如果关闭了会导致这个套接字不可用, #但是此时在线程中这个套接字可能还在收数据,因此不能关闭 #newSocket.close() finally: serSocket.close()if __name__ == "__main__": main()
线程的开销较小,且共享套接字。
阅读全文
0 0
- Python版单进程、多进程、多线程服务器
- 单进程+多线程+同步 python 服务器 demo
- python --- 多线程处理(单进程/多进程)
- 单进程服务器(python版)
- 多进程、多线程服务器
- 单进程多线程并发服务器实现
- window平台单进程多线程服务器通信
- python 多线程多进程
- python多线程、多进程
- python 多线程/多进程
- Python 多进程 多线程
- python多进程多线程
- python 多进程,多线程
- 单进程select版-TCP服务器(python 版)
- 单进程epoll版-TCP服务器(python 版)
- 单进程gevent版-TCP服务器(python 版)
- 单进程服务器-非堵塞模式(python版)
- python非阻塞式单进程服务器
- redis.conf配置详解
- Git与Repo入门
- 机器学习中的范数规则化之(一)L0、L1与L2范数
- Nginx配置SSL证书部署HTTPS网站
- C/C++:各种基本算法实现小结(一)—— 单链表
- Python版单进程、多进程、多线程服务器
- springboot druid 数据库批量更新错误 multi-statement not allow
- CODE[VS]1016 税收与补贴问题
- JavaWeb应用技术概述
- C++实现二分查找算法
- wordpress伪静态化之后去除category分类
- java中输入char类型的数据
- github项目学习--Vue结合Pug模板引擎
- 加深理解指针的四个实验