lanbda_20080810 2023-02-28 14:13 采纳率: 60.9%
浏览 29
已结题

TCP多客户端问题,请求不回复

从网上摘抄了代码,改了改,想做一个连接自动回复,但是压力测试时发现,几个请求之后卡死不动了。开新的客户也不回复。

img

img

#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太快没反应过来。

  • 写回答

2条回答 默认 最新

  • MarkHan_ 2023-02-28 14:25
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    根据代码,client_flag 是一个全局变量,用于判断当前是否有客户端连接。当有客户端连接时,client1 函数会被执行,但是在函数结束之前就将 client_flag 设置为 1,表示已经有客户端连接了。在主函数中,会不断循环判断 client_flag 是否为 1,如果是,就新建一个线程处理客户端连接,同时将 client_flag 设置为 0。
    -
    问题可能出在新建线程的过程中。当一个客户端连接后,client1 函数会在新的线程中执行。但是如果在新线程启动之前,又有新的客户端连接,那么 client_flag 又被设置为 1,新线程的创建就被阻塞了。这可能导致程序卡死不动。
    -
    解决方法可以使用线程池来管理线程,避免频繁地创建和销毁线程。可以使用 Python 的 concurrent.futures 库来实现线程池。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月8日
  • 已采纳回答 2月28日
  • 创建了问题 2月28日

悬赏问题

  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。
  • ¥15 已知隐函数其中一个变量τ的具体值,求另一个变量
  • ¥15 r语言Hurst指数
  • ¥15 Acrn IVSHMEM doorbell问题
  • ¥15 yolov5中的val测试集训练时数量变小问题
  • ¥15 MPLS/VPN实验中MPLS的配置问题
  • ¥15 materialstudio氢键计算问题
  • ¥15 echarts图表制作