多进程并发服务器
多进程并发服务器中的主进程用于处理客户端的连接请求,当有新的客户端与服务器建立连接后,服务器会创建一个子进程,由子进程完成数据的交互工作。
以可将小写字符串转为大写字符串的服务器为例,多进程并发服务器的实现如下。
import socket
import multiprocessing
# 与客户端进行交互
def deal_with_client(new_socket, client_address):
while True:
recv_data = new_socket.recv(1024).decode('gb2312')
if len(recv_data) > 0:
print('待处理数据:%s:%s' % (str(client_address), recv_data))
data = recv_data.upper()
new_socket.send(data.encode('gb2312'))
else:
print('客户端[%s]已关闭' % str(client_address))
break
new_socket.close()
def main():
# 创建服务器套接字server_socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 端口快速重启用
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
local_address = ('', 8081)
server_socket.bind(local_address)
server_socket.listen(5)
print('-----服务器------')
try:
while True:
# 处理客户端连接请求
new_socket, client_address = server_socket.accept()
print('一个新的客户端到达[%s]' % str(client_address))
# 创建子进程与客户端进行交互
client = multiprocessing.Process(target=deal_with_client,
args=(new_socket, client_address))
client.start()
# 关闭父进程中的套接字new_socket
new_socket.close()
finally:
# 关闭服务器套接字
server_socket.close()
if __name__ == '__main__':
main()
以上服务器的实现流程与14.4节中TCP数据转换服务器的实现流程相同,只是这个服务器在与客户端建立连接后创建了用于与本次连接的客户端进行数据交互的子进程。
为了测试此段服务器代码,这里实现一个可向服务器发送数据,并接收服务器反馈数据的客户端。客户端代码实现如下:
import socket
def main():
# 1.创建套接字client _socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.请求连接
client_socket.connect(('172.16.43.31', 8081))
# 3.发送数据
while True:
data = input("-----待处理数据------\n")
client_socket.send(data.encode('gb2312'))
recv_info = client_socket.recv(1024).decode('gb2312')
print("------处理结果-------\n%s" % recv_info)
# 4.关闭聊天室套接字server_socket
server_socket.close()
if __name__ == '__main__':
main()
启动服务器,服务器中会显示如下信息:
-----服务器------
在多个终端中执行客户端进程,服务器端逐个打印每个客户端的地址信息:
一个新的客户端到达[('172.16.43.31', 7866)]
一个新的客户端到达[('172.16.43.31', 7868)]
一个新的客户端到达[('172.16.43.31', 7869)]
一个新的客户端到达[('172.16.43.31', 7873)]
由此可知,本节实现的多进程并发服务器可同时与多个客户端进程建立连接。使用其中一个客户端向服务器中发送信息,客户端中打印的数据如下所示:
-----待处理数据------
hello itheima
------处理结果-------
HELLO ITHEIMA
-----待处理数据------
由以上数据可知,服务器成功接收到客户端发送的数据,并将数据转换为大写后返回到客户端。
综上所述,多进程并发服务器实现成功。