7.7 TCP的网络应用程序开发—多任务版TCP服务端程序开发
学习目标
-
能够说出多任务版TCP服务端程序的实现过程
1. 需求
目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?
完成多任务,可以使用线程,比进程更加节省内存资源。
-
编写一个TCP服务端程序,循环等待接受客户端的连接请求
-
当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞
-
把创建的子线程设置成为守护主线程,防止主线程无法退出。
3. 间歇执行多任务的TCP服务端程序示例代码
import socket # 导入socket包 if __name__ == '__main__': # 步骤1:建立服务端的套接字对象 tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 设置端口复用 tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) # 步骤2:绑定ip地址和端口号 tcp_server_socket.bind(("192.168.109.128",8888)) # 步骤3:设置监听 tcp_server_socket.listen(128) while True: # 步骤4:等待客户端连接 service_client_socket,ip_port = tcp_server_socket.accept() print("客户端的ip地址和端口号为:",ip_port) # 步骤5:接收客户端发送的数据 recv_data = service_client_socket.recv(1024) recv_data = recv_data.decode(encoding="utf-8") print("接收到客户端发送的信息:%s,长度为%d。"%(recv_data,len(recv_data))) # 步骤6:向客户端发送数据 send_data = "雪山收到,冰川请讲!" send_data = send_data.encode(encoding="utf-8") service_client_socket.send(send_data) # 步骤7:关闭套接指对象,中止与客户端的通信 service_client_socket.close() tcp_server_socket.close()
4. 同时执行多任务的TCP服务端程序示例代码
import socket # 导入socket包 import threading def tranceiver(service_client_socket): # 信息收发函数 # 步骤5:接收客户端发送的数据 recv_data = service_client_socket.recv(1024) recv_data = recv_data.decode(encoding="utf-8") print("接收到客户端发送的信息:%s,长度为%d。" % (recv_data, len(recv_data))) # 步骤6:向客户端发送数据 send_data = "雪山收到,冰川请讲!" send_data = send_data.encode(encoding="utf-8") service_client_socket.send(send_data) # 步骤7:关闭套接指对象,中止与客户端的通信 service_client_socket.close() if __name__ == '__main__': # 步骤1:建立服务端的套接字对象 tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 设置端口复用 tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) # 步骤2:绑定ip地址和端口号 tcp_server_socket.bind(("192.168.109.128",8888)) # 步骤3:设置监听 tcp_server_socket.listen(128) while True: # 步骤4:等待客户端连接 service_client_socket,ip_port = tcp_server_socket.accept() print("客户端的ip地址和端口号为:",ip_port) tranceiver_thread = threading.Thread(target=tranceiver,args=(service_client_socket,)) tranceiver_thread.setDaemon(True) # 讲该线程设置为守护主线程 tranceiver_thread.start() tcp_server_socket.close()
5. 小结
-
编写一个TCP服务端程序,循环等待接受客户端的连接请求
while True:
service_client_socket, ip_port = tcp_server_socket.accept() -
当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞
while True:
service_client_socket, ip_port = tcp_server_socket.accept()
sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))
sub_thread.start() -
把创建的子线程设置成为守护主线程,防止主线程无法退出。
while True:
service_client_socket, ip_port = tcp_server_socket.accept()
sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))
sub_thread.setDaemon(True)
sub_thread.start()

浙公网安备 33010602011771号