最终目标:启动服务后可以有无数个访问,并且可以随时输入,服务端使用进程池。
服务端
from socket import * import os,time from concurrent.futures import ProcessPoolExecutor def func(conn,addr): while True: try: ret = conn.recv(1024) if not ret:break time.sleep(5) print(ret.decode('utf-8')) conn.send(ret.upper()) print("端口号:【%s】是,进程ID:【%s】"% (addr[1],os.getpid())) except ConnectionResetError: break if __name__ == "__main__": server = socket(AF_INET, SOCK_STREAM) server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) server.bind(('127.0.0.1', 8130)) server.listen(5) p = ProcessPoolExecutor(2) while True: conn,addr = server.accept() p.submit(func,conn,addr)
客户端
from socket import * while True: client = socket(AF_INET, SOCK_STREAM) #这里使用的是伪链接,每输入一次都会断开,但客户端看起来一直与服务端保持着链接,其实没有 data = input('>>>').strip() client.connect(('127.0.0.1',8130)) client.send(data.encode('utf-8')) ret = client.recv(1024) print(ret.decode('utf-8')) client.close()
创建了4个客户端,执行结果
hgsdfa 端口号:【54815】是,进程ID:【15828】 eawd 端口号:【54817】是,进程ID:【5580】 few 端口号:【54819】是,进程ID:【15828】 few 端口号:【54820】是,进程ID:【5580】 cv; 端口号:【54829】是,进程ID:【15828】 g 端口号:【54831】是,进程ID:【5580】 #可以清楚的看到,进程ID只有两个,证明确实是在进程池中循环