多程序併發模型--os.fork()
阿新 • • 發佈:2021-01-11
使用fork完成併發
【1】建立套接字,繫結,監聽
【2】 等待接受客戶端連線請求
【3】建立新的程序處理客戶端請求,父程序繼續等待連線其他客戶端
【4】客戶端退出對應子程序結束
【osfork-server.py】
from socket import *
import os,sys
import signal
#建立套接字
HOST = "0.0.0.0"
PORT = 8888
ADDR = (HOST,PORT)
def client_handler(c):
print("Connect from ",c.getpeername())
try:
while True:
data = c.recv(1024).decode()
if not data:
break
print(data)
c.send(b"Receive your message")
except (KeyboardInterrupt,SystemExit):
sys.exit("退出程序")
except Exception as e:
print(e)
c.close()
sys.exit(0) #子程序結束
s = socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(ADDR)
s.listen(5)
print("Parent process wait connect")
#對殭屍程序處理
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
while True:
try:
c,addr = s.accept()
except KeyboardInterrupt:
s.close()
sys.exit("伺服器退出 ")
except Exception as e:
print(e)
continue
#建立子程序處理客戶端請求
pid = os.fork()
if pid == 0:
s.close()
#處理客戶端請求
client_handler(c)
else:
c.close()
continue
from socket import *
#建立套接字
sockfd = socket()
#發起連線
sockfd.connect(('127.0.0.1',8888))
while True:
#訊息收發
msg = input("Msg>>")
if not msg:
break
sockfd.sendall(msg.encode())
data = sockfd.recv(1024)
print(data.decode())
sockfd.close()