案例——多任务版TCP服务端程序开发
1. 需求
目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?完成多任务,可以使用线程,比进程更加节省内存资源。
2. 具体实现步骤
编写一个TCP服务端程序,循环等待接受客户端的连接请求
当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞
把创建的子线程设置成为守护主线程,防止主线程无法退出。
3. 多任务版TCP服务端程序的示例代码:
1 import socket 2 import threading 3 4 5 # 处理客户端的请求操作 6 def handle_client_request(service_client_socket, ip_port): 7 # 循环接收客户端发送的数据 8 while True: 9 # 接收客户端发送的数据 10 recv_data = service_client_socket.recv(1024) 11 #容器类型判断是否有数据可以直接使用if语句进行判断,如果容器类型里面有数据表示条件成立,否则条件失败 12 # 容器类型: 列表、字典、元组、字符串、set、range、二进制数据 13 if recv_data: 14 print(recv_data.decode("utf-8"), ip_port) 15 # 回复 16 service_client_socket.send("ok,问题正在处理中...".encode("utf-8")) 17 18 else: 19 print("客户端下线了:", ip_port) 20 break 21 # 终止和客户端进行通信 22 service_client_socket.close() 23 24 25 if __name__ == '__main__': 26 # 创建tcp服务端套接字 27 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 28 # 设置端口号复用,让程序退出端口号立即释放 29 tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 30 # 绑定端口号 31 tcp_server_socket.bind(("", 9090)) 32 # 设置监听, listen后的套接字是被动套接字,只负责接收客户端的连接请求 33 tcp_server_socket.listen(128) 34 # 循环等待接收客户端的连接请求 35 while True: 36 # 等待接收客户端的连接请求 37 service_client_socket, ip_port = tcp_server_socket.accept() 38 print("客户端连接成功:", ip_port) 39 # 当客户端和服务端建立连接成功以后,需要创建一个子线程,不同子线程负责接收不同客户端的消息 40 sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port)) 41 # 设置守护主线程 42 sub_thread.setDaemon(True) 43 # 启动子线程 44 sub_thread.start() 45 46 # tcp服务端套接字可以不需要关闭,因为服务端程序需要一直运行 47 # tcp_server_socket.close() 48 -------------------------------------------------------------------- 49 50 执行结果: 51 52 客户端连接成功: ('172.16.47.209', 51528) 53 客户端连接成功: ('172.16.47.209', 51714) 54 hello1 ('172.16.47.209', 51528) 55 hello2 ('172.16.47.209', 51714)