亘木秋 2025-03-14 17:37 采纳率: 0%
浏览 11

提问:QT中socket的服务器的设计思路

#项目背景是在qt上的一个socket服务器
#服务器的server监听,然后大量的客户端连接,然后进行消息的业务(io操作、逻辑业务)
#我们知道,程序的server肯定是主窗口的一个成员,因此server连接创建的所有客户端socket都属于主线程,但是让主线程同时管理UI界面,socket的业务,肯定随着客户端socket的数量上升会使得系统卡顿。
#所以我们要用多线程,QT支持线程和线程池,给每一个socket分配一个线程肯定不显示(但是让一个线程同时管理几个socket我还没有试过),那就只有使用线程池,但是由于QT的socket有线程安全问题,你不能直接传指针QTcpSocket * s过去,会报错。然后我就想传文件描述符过去,在线程池里新建一个socket的副本,但是遇到了QSocketNotifier: Multiple socket notifiers for same socket 1748 and type Read报错,说人话就是一个文件描述符只能有一个读取器(socket),那就把socket交给线程池管理呗,这样确实不会有线程安全的问题,但是继承qrunnable重写工作类之后,run函数只跑一次,跑完之后会清理资源,这个时候socket会被清理掉,又不能保证socket的长期稳定存在,别人的消息你可以接受不到。
#我才疏学浅,确实没有想到更好的方法了,折磨了一下午通义和deepseek,确实没想法了。希望各位能提点一下思路。

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-03-14 17:37
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    QT中socket的服务器设计思路

    在QT中设计一个socket服务器,可以使用QT的网络编程库,例如QTcpServer和QTcpSocket。下面是一个基本的设计思路:

    1. 创建QTcpServer对象,设置监听端口和地址。
    QTcpServer server;
    server.listen(QHostAddress::Any, 8080);
    
    1. 在服务器端,使用QTcpSocket对象来处理客户端的连接和数据传输。
    QTcpSocket *socket = server.nextPendingConnection();
    
    1. 在客户端连接成功后,服务器可以使用socket对象来发送和接收数据。
    socket->write("Hello, client!");
    socket->flush();
    
    1. 在服务器端,使用QThread对象来处理客户端的连接和数据传输,以避免阻塞主线程。
    QThread *thread = new QThread;
    socket->moveToThread(thread);
    thread->start();
    
    1. 在服务器端,使用QMutex对象来保护共享资源,避免数据竞争。
    QMutex mutex;
    mutex.lock();
    // 业务逻辑
    mutex.unlock();
    
    1. 在服务器端,使用QTimer对象来实现定时任务,例如定时发送数据或关闭连接。
    QTimer *timer = new QTimer;
    timer->start(1000);
    connect(timer, &QTimer::timeout, this, &MyServer::sendData);
    
    1. 在服务器端,使用QSettings对象来存储和读取配置信息,例如服务器的监听端口和地址。
    QSettings settings("server.ini", QSettings::IniFormat);
    settings.setValue("port", 8080);
    settings.setValue("address", "localhost");
    
    1. 在服务器端,使用QDebug对象来 debug 服务器的日志信息。
    qDebug() << "Server started on port " << server.serverPort();
    

    这些是QT中socket服务器的基本设计思路,具体实现可能会根据项目的需求和复杂度而有所不同。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月14日