(二)一个简单的并发服务器

概述

那么最简单的服务端并发处理客户端请求就是,父进程用监听套接字监听,当有连接过来时那么监听套接字就变成了已连接套接字(源和目的的IP和端口都包含了),这时候就可以和客户端通信,但此时其他客户端无法连接进来,因为这个套接字被占用,所以就会产生一个子进程来处理和客户端的通信,也就是这个连接套接字由子进程处理,而父进程继续用监听套接字的形式来等待下一个连接请求。

代码段

服务器程序

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # Author: rex.cheny
 4 # E-mail: [email protected]
 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: [email protected]
 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()

结果演示

猜你喜欢

转载自www.cnblogs.com/yunxizhujing/p/9692470.html