14-TCP服务器端框架
目标¶
- 能够使用多线程实现同时接收多个客户端的多条信息
1. TCP服务器端¶
1、实现制定端口监听
2、实现服务器端地址重用,避免"Address already in use" 错误
3、能够支持多个客户端连接
4、能够支持不同的客户端同时收发消息(开启子线程)
5、服务器端主动关闭服务后,子线程随之结束
import socket
import threading
def recv_msg(new_socket):
# 建立套接字
while True:
# 5、接收客户端发送过来的信息
recv_data = new_socket.recv(1024)
# 如果数据存在,则对接收到的数据进行转码
if recv_data:
re_text = recv_data.decode("gbk")
print(re_text)
# 6、给客户端发送确认信息
else:
break
new_socket.send("7878收到,谢谢~".encode("utf-8"))
# 7、关闭连接
new_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、绑定端口,绑定7878端口
tcp_server_socket.bind(("", 7878))
# 3、将主动模式调整为被动模式
tcp_server_socket.listen(128)
while True:
# 4、接收客户端连接
new_socket, ip_port = tcp_server_socket.accept()
print(ip_port) # 查看已经连接的客户端ip和端口
# 开启线程
t1 = threading.Thread(target=recv_msg, args=(new_socket,))
# 设置线程守护
t1.setDaemon(True)
t1.start()
# 8、不再接收新请求
tcp_server_socket.close()
运行效果:
2. 设置守护线程¶
# 开启线程
t1 = threading.Thread(target=recv_msg, args=(new_socket, ))
# 设置线程守护
t1.setDaemon(True)
t1.start()
t1.setDaemon(True)
表示守护主线程,如果主线程关闭,子线程也随之结束
如果没有设置守护主线程,那么此时如果服务器端主动结束,子线程则还在继续运行,这就不对了。