#基于fork的多进程网络并发模型
实现步骤
- 创建监听套接字
- 等待接收客户端请求
- 客户端连接创建新的进程处理客户端请求
- 原进程继续等待其他客户端连接
- 如果客户端退出,则销毁对应的进程
服务端代码呈现
"""
fork_server.py 基于fork的多进程服务
重点代码
"""
from socket import *
import os
import signal
# 全局变量
HOST = '0.0.0.0'
PORT = 8888
ADDR = (HOST,PORT)
# 处理客户端请求
def handle(c):
while True:
data = c.recv(1024)
if not data:
break
print(data.decode())
c.send(b'OK')
c.close()
# 创建tcp套接字
s = socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(ADDR)
s.listen(3)
# 处理僵尸进程产生
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
print("Listen the port 8888...")
while True:
# 循环接受客户端链接
try:
c,addr = s.accept()
print("Connect from",addr)
except KeyboardInterrupt:
s.close()
os._exit(0)
except Exception as e:
print(e)
continue
# 客户端链接处理
pid = os.fork()
if pid == 0:
# 处理请求
s.close()
handle(c) # 处理具体请求
os._exit(0) # 处理完请求子进程结束
else:
c.close() # 父进程循环回去继续等待其他客户端
客户端代码呈现
‘’’
客户端
‘’’
from socket import *
socket=socket()
server_addr=('0.0.0.0',13736)
socket.connect(server_addr)
while True:
data = input("Msg>>")
socket.send(data.encode())
if not data:
break
data=socket.recv(1024)
print('server:',data.decode())#d打印字符串
socket.close()
基于threading的多线程网络并发
实现步骤
- 创建监听套接字
- 循环接收客户端连接请求
- 当有新的客户端连接创建线程处理客户端请求
- 主线程继续等待其他客户端连接
- 当客户端退出,则对应分支线程退出
‘’’
多线程并发 重点代码
'''
from socket import *
import sys
from threading import Thread
HOST = '0.0.0.0'
PORT = 13736
ADDR= (HOST,PORT)
def handle(c):
while True:
data = c.recv(1024)
if not data:
break
print(data.decode())
c.send(b'ok')
c.close()
#创建套接子
s=socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(ADDR)
s.listen(3)
print("Listen the port 8888...")
#循环接受客户端链接请求
while True:
try:
c,addr = s.accept()
print("Connect from",addr)
except KeyboardInterrupt:
sys.exit('服务器退出')
except Exception as e:
print(e)
continue
#创建线程处理
t=Thread(target=handle,args=(c,))
t.setDaemon(True) #主线程退出 其他线程也退出
t.start() # 线程资源小于进程 不用回收 join