从网上摘抄了代码,改了改,想做一个连接自动回复,但是压力测试时发现,几个请求之后卡死不动了。开新的客户也不回复。
#server
import socket
import threading
client_flag=0
def client1(socket_tcp_server):
global client_flag
new_client_socket, client_addr = socket_tcp_server.accept() #当服务器得到客户端请求连接时,client_flag=1
client_flag=1
print("客户端连接成功",client_addr)
send_date = "收到"
new_client_socket.send(send_date.encode("gbk"))
new_client_socket.close()
print("对方已经结束了会话,等待新的连接")
def main():
global client_flag
socket_tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket_addr=("127.0.0.1",1080)
socket_tcp_server.bind(socket_addr)
socket_tcp_server.listen(128)
print("等待一个新客户端连接....")
client1_threading = threading.Thread(target=client1, args=(socket_tcp_server,))
client1_threading.start()
while True:
if client_flag:
client1_threading = threading.Thread(target=client1,args=(socket_tcp_server,)) #新建一个线程
client1_threading.start()
client_flag = 0
if __name__ =='__main__':
main()
#locate
import socket
import threading
class receive:
def main(server_ip,server_port):
socket_tcp_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建一个套接字
server_addr=(server_ip,int(server_port))
socket_tcp_client.connect(server_addr)# 2.绑定连接
recv_date = socket_tcp_client.recv(1024) #接收信息,每次最大为1024
print("接收到的数据为:", recv_date.decode("gbk")) #decode为解码,gbk为解码方式
if __name__ =='__main__':
while True:
receive.main("127.0.0.1",1080)
测试发现可能是client_flag太快没反应过来。
该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据代码,client_flag 是一个全局变量,用于判断当前是否有客户端连接。当有客户端连接时,client1 函数会被执行,但是在函数结束之前就将 client_flag 设置为 1,表示已经有客户端连接了。在主函数中,会不断循环判断 client_flag 是否为 1,如果是,就新建一个线程处理客户端连接,同时将 client_flag 设置为 0。
-
问题可能出在新建线程的过程中。当一个客户端连接后,client1 函数会在新的线程中执行。但是如果在新线程启动之前,又有新的客户端连接,那么 client_flag 又被设置为 1,新线程的创建就被阻塞了。这可能导致程序卡死不动。
-
解决方法可以使用线程池来管理线程,避免频繁地创建和销毁线程。可以使用 Python 的 concurrent.futures 库来实现线程池。