利用gevent第三方库,实现协程。
通过协程实现一个服务端服务多个客户端,推荐使用协程版,因为协程比线程更加节省资源。
gevent安装命令:
pip3 install gevent
注意:在安装gevent库之前,需要更新pip版本,只需要在终端窗口执行以下命令即可:
python -m pip install --upgrade pip
TCP服务端-协程版本:
1 import socket
2 import gevent
3 from gevent import monkey
4
5 # 打补丁
6 monkey.patch_all()
7
8
9 def handle_client_socket(new_socket, ip_port):
10 print("建立连接成功:", ip_port)
11 while True:
12 recv_data = new_socket.recv(1024)
13 if recv_data:
14 recv_data_decode = recv_data.decode("UTF-8")
15 print("服务端接收的数据为:", recv_data_decode)
16 else:
17 print("客户端下线了", ip_port)
18 break
19 # 8.使用新的套接字发送数据
20 send_data_input = input("请输入回复的消息:")
21 send_data = send_data_input
22 send_data_encode = send_data.encode("UTF-8")
23 new_socket.send(send_data_encode)
24 # 7.使用新的套接字接收数据,并设置最大数据接收长度为1024
25
26 # 9.关闭套接字
27 # 与客户端断开通信
28 new_socket.close()
29
30
31 # 1.导入模块
32 if __name__ == '__main__':
33 # 2.创建套接字对象
34 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
35
36 # 3.设置端口复用
37 tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
38
39 # 4.绑定端口
40 tcp_server_socket.bind(("", 9090))
41
42 # 5.设置监听,并设置最大等待连接数为128
43 tcp_server_socket.listen(128)
44 while True:
45 # 6.等待客户端建立连接,并接收accpet()返回的新的套接字对象,和客户端IP+端口号
46 new_socket, ip_port = tcp_server_socket.accept()
47 gevent.spawn(handle_client_socket, new_socket, ip_port)
48
49 # 停止服务端服务
50 # tcp_server_socket.close()