标签:def 数据 被占用 方式 nec outlook 请求 tcp连接 turn
那么最简单的服务端并发处理客户端请求就是,父进程用监听套接字监听,当有连接过来时那么监听套接字就变成了已连接套接字(源和目的的IP和端口都包含了),这时候就可以和客户端通信,但此时其他客户端无法连接进来,因为这个套接字被占用,所以就会产生一个子进程来处理和客户端的通信,也就是这个连接套接字由子进程处理,而父进程继续用监听套接字的形式来等待下一个连接请求。
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # Author: rex.cheny 4 # E-mail: rex.cheny@outlook.com 5 6 import socket 7 import os, time, sys 8 9 10 def echoStr(connFd): 11 print("新连接:", connFd.getpeername()) 12 while True: 13 bytesData = connFd.recv(1024) 14 data = bytesData.decode(encoding="utf-8") 15 print("收到客户端消息:", data) 16 if data == "Bye": 17 return 18 else: 19 time.sleep(1) 20 connFd.send(data.encode(encoding="utf-8")) 21 22 23 def main(): 24 sockFd = socket.socket() 25 sockFd.bind(("", 5555)) 26 sockFd.listen(5) 27 28 print("等待客户端连接......") 29 while True: 30 connFd, remAddr = sockFd.accept() 31 32 try: 33 pid = os.fork() 34 if pid == 0: 35 # 说明当前运行在子进程中 36 sockFd.close() # 关闭监听套接字 37 echoStr(connFd) # 执行回显函数 38 # connFd.close() # 关闭连接套接字,这里是否要显示的关闭和客户端的连接套接字与个人编程风格有关,因为客户端发送完数据后就主动调用了close() 39 exit(0) # 子进程退出 40 else: 41 """ 42 关闭连接套接字,这时候并不会关闭服务器与客户端的TCP连接,因为connFd这个套接字的会被子进程所使用,所以该套接字的引用 43 计数器为1,只有为0时才会被关闭。 44 """ 45 connFd.close() 46 except Exception as err: 47 print(err) 48 49 50 if __name__ == ‘__main__‘: 51 main()
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # Author: rex.cheny 4 # E-mail: rex.cheny@outlook.com 5 6 import socket 7 8 9 def echoStr(sockFd, data): 10 sockFd.send(data) 11 bytesData = sockFd.recv(1024) 12 data = bytesData.decode(encoding="utf-8") 13 print(data) 14 15 16 def main(): 17 sockFd = socket.socket() 18 sockFd.connect(("127.0.0.1", 5555)) 19 20 for i in range(1, 11): 21 data = "第:" + str(i) + " 条消息。" 22 echoStr(sockFd, data.encode(encoding="utf-8")) 23 24 echoStr(sockFd, "Bye".encode(encoding="utf-8")) 25 sockFd.close() 26 27 28 if __name__ == ‘__main__‘: 29 main()
这时候就实现了多个客户端并发连接服务器端。这里只是演示了一种最简单也是最原始的一种方式,因为fork一个进程系统开销很大所以虽然是并发但是不适用大规模并发的情况下。
标签:def 数据 被占用 方式 nec outlook 请求 tcp连接 turn
原文地址:https://www.cnblogs.com/yunxizhujing/p/9692470.html