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

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 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄