7.7 TCP的网络应用程序开发—多任务版TCP服务端程序开发

7.7 TCP的网络应用程序开发—多任务版TCP服务端程序开发

学习目标

  • 能够说出多任务版TCP服务端程序的实现过程


1. 需求

  目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?

  完成多任务,可以使用线程,比进程更加节省内存资源。

2. 具体实现步骤

  1. 编写一个TCP服务端程序,循环等待接受客户端的连接请求

  2. 当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞

  3. 把创建的子线程设置成为守护主线程,防止主线程无法退出。

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. 小结

  1. 编写一个TCP服务端程序,循环等待接受客户端的连接请求

     while True:
        service_client_socket, ip_port = tcp_server_socket.accept()
  2. 当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞

     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()
  3. 把创建的子线程设置成为守护主线程,防止主线程无法退出。

     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()
posted @ 2022-08-27 21:50  在代码的海洋里游淌  阅读(53)  评论(0)    收藏  举报