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