#项目背景是在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,确实没想法了。希望各位能提点一下思路。
提问:QT中socket的服务器的设计思路
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
4条回答 默认 最新
阿里嘎多学长 2025-03-14 17:37关注阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
QT中socket的服务器设计思路
在QT中设计一个socket服务器,可以使用QT的网络编程库,例如QTcpServer和QTcpSocket。下面是一个基本的设计思路:
- 创建QTcpServer对象,设置监听端口和地址。
QTcpServer server; server.listen(QHostAddress::Any, 8080);- 在服务器端,使用QTcpSocket对象来处理客户端的连接和数据传输。
QTcpSocket *socket = server.nextPendingConnection();- 在客户端连接成功后,服务器可以使用socket对象来发送和接收数据。
socket->write("Hello, client!"); socket->flush();- 在服务器端,使用QThread对象来处理客户端的连接和数据传输,以避免阻塞主线程。
QThread *thread = new QThread; socket->moveToThread(thread); thread->start();- 在服务器端,使用QMutex对象来保护共享资源,避免数据竞争。
QMutex mutex; mutex.lock(); // 业务逻辑 mutex.unlock();- 在服务器端,使用QTimer对象来实现定时任务,例如定时发送数据或关闭连接。
QTimer *timer = new QTimer; timer->start(1000); connect(timer, &QTimer::timeout, this, &MyServer::sendData);- 在服务器端,使用QSettings对象来存储和读取配置信息,例如服务器的监听端口和地址。
QSettings settings("server.ini", QSettings::IniFormat); settings.setValue("port", 8080); settings.setValue("address", "localhost");- 在服务器端,使用QDebug对象来 debug 服务器的日志信息。
qDebug() << "Server started on port " << server.serverPort();这些是QT中socket服务器的基本设计思路,具体实现可能会根据项目的需求和复杂度而有所不同。
解决 无用评论 打赏 举报