---------Python基础编程---------

Author : AI菌


 

【内容讲解】

一、解释:
    能够同时服务于多个客户端的TCP服务端程序
二、具体实现步骤
    1、编写一个TCP服务端程序,循环等待接受客户端的连接请求
    2、当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞
    3、把创建的子线程设置成为守护主线程,防止主线程无法退出。

 

【代码演示】

"""
一、解释:
    能够同时服务于多个客户端的TCP服务端程序
二、具体实现步骤
    1、编写一个TCP服务端程序,循环等待接受客户端的连接请求
    2、当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞
    3、把创建的子线程设置成为守护主线程,防止主线程无法退出。
"""

import socket
import threading


# 处理客户端请求的函数
def handle_client(new_socket, ip_port):
    # 循环接收客户端的数据
    while True:
        # 接收客户端发送的数据
        recv_data = new_socket.recv(1024)
        if recv_data:
            # 对二进制数据进行解码
            recv_content = recv_data.decode("utf-8")
            print("接收客户端的数据为:", recv_content)
            # 发送数据
            new_socket.send("服务端".encode("utf-8"))
        else:
            print("客户端下线:", ip_port)
            break
    # 关闭套接字
    new_socket.close()


if __name__ == '__main__':
    # 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用,程序退出端口号立即释放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口号
    tcp_server_socket.bind(("", 9090))
    # 设置监听
    tcp_server_socket.listen(128)

    # 循环等待接受客户端的连接请求
    while True:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        print("客户端为:", ip_port)
        # 创建子线程,专门负责处理客户端请求
        sub_thread = threading.Thread(target=handle_client, args=(new_socket, ip_port))
        # 设置守护主线程,防止服务端无法关闭
        sub_thread.setDaemon(True)
        # 启动子线程执行任务
        sub_thread.start()

    # 提示: 服务端程序需要一直运行,所以tcp服务端的套接字可以不用关闭
    # tcp_server_socket.close()

 

【运行结果】

TCP客户端程序(网络调试助手):

Python 多线程 socket被阻塞 python多线程tcp客户端_Python

 

 

 

 

 

 

 

 

 

 

 

作为TCP服务端的程序:

客户端为: ('192.168.1.235', 39664)
客户端为: ('192.168.1.235', 39666)
接收客户端的数据为: client_1
接收客户端的数据为: client_2