步骤:
服务端对应父进程 客户端对应子进程 父进程循环接收连接 为每个连接建立子进程 处理接受信息
1.1多进程并发
"""
fork多进程并发
"""
import signal
from socket import *
import os
# 全局变量
ADDR = ('0.0.0.0', 8888)
# 客户端处理函数
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)
# 处理僵尸进程
# 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() # 子进程中没有需要用s
# 处理客户端请求
handle(c)
os._exit(0)
else:
c.close() # 父进程中没有需要用c
2.1多线程并发
"""
多线程并发
"""
import signal
from socket import *
import os
from threading import Thread
# 全局变量
ADDR = ('0.0.0.0', 8888)
# 客户端处理函数
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)
# 处理僵尸进程
# 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
t = Thread(target=handle, args=(c,)) # 若不传父线程每次连接 连接套接字就会被覆盖掉
t.setDaemon(True) # 主线程停止服务后 所有分支线程都终止
t.start()