案例-多任务版TCP服务端程序开发

案例-多任务版TCP服务端程序开发

如何实现一个服务端服务多个客户端

实现分析:编写一个TCP服务端程序,循环等待接受客户端的连接请求

import 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(("127.0.0.1", 8080))
    # 3. 设置监听 128代表服务端等待排队连接的最大数量
    tcp_server_socket.listen(128)
    while True:
        # 4. 等待客户端的连接请求 阻塞等待 返回一个用以和客户端通信的socket, 客户端地址
        conn_socket, ip_port = tcp_server_socket.accept()
        print(f'客户端地址:{ip_port}')
        # 5. 接收数据
        recv_data = conn_socket.recv(1024)
        print(f'接收到的数据:{recv_data.decode()}')
        # 6. 发送数据
        conn_socket.send('客户端你的数据我收到了'.encode())
        # 7. 关闭套接字
        conn_socket.close()
    tcp_server_socket.close()

如何实现一个服务端同时服务多个客户端

实现分析:

  1. 使用多任务可以实现,一个服务端同时服务多个客户端。
  2. 当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞
%%{init: {"flowchart": {"defaultRenderer": "dagre", "htmlLabels": false}} }%%
flowchart TD
	a1(服务端) --> a2(bind) --> a3(listen) --> a4(accept)
	b1(客户端1) -- "connect连接" --> a4 --"线程1"--> b2(send
recv) --- b1 c1(客户端2) -- "connect连接" --> a4 --"线程2"--> c2(send
recv) --- c1

代码实现:

import socket
import threading

# 处理客户端函数
def handle_client(conn_socket):
    # 5. 接收数据
    recv_data = conn_socket.recv(1024)
    print(f'接收到的数据:{recv_data.decode()}')
    # 6. 发送数据
    conn_socket.send('客户端你的数据我收到了'.encode())
    # 7. 关闭套接字
    conn_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(("127.0.0.1", 8080))
    # 3. 设置监听 128代表服务端等待排队连接的最大数量
    tcp_server_socket.listen(128)
    while True:
        # 4. 等待客户端的连接请求 阻塞等待 返回一个用以和客户端通信的socket, 客户端地址
        conn_socket, ip_port = tcp_server_socket.accept()
        print(f'客户端地址:{ip_port}')

        # 使用多线程接受多个客户端的请求
        sub_thread = threading.Thread(target=handle_client, args= (conn_socket,))
        sub_thread.start()

    tcp_server_socket.close()