两年前初学时做的C/S架构服务器,现在整理下发出来供大家参考。
哈哈哈,发现居然有人看,资源放这了,有需要可以瞅瞅,没积分可留言。
首先是入口处,创建tcpServer类进行监听,QT使用TCP模块需要在Pro文件加上QT += sql network,sql模块是因为使用了数据库。
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyTcpServer* tcpServer = new MyTcpServer();
tcpServer->listen(QHostAddress::Any, quint16(10626));
qDebug() << "开始监听端口: 10626";
return a.exec();
}
MyTcpServer是继承自QTcpServer的类。
该类需要至少重载实现void incomingConnection(qintptr handle)这个函数。
下面是我的.h头文件
class MyTcpServer : public QTcpServer
{
Q_OBJECT
public:
explicit MyTcpServer(QObject* parent = nullptr);
void incomingConnection(qintptr handle); // 重载实现该函数进行数据接收读取
~MyTcpServer();
signals:
void clientDisconnected(qintptr handle);
protected:
QHash<QString, bool> userOnlineHash; //在线
QHash<qintptr, QThread*> socketThreadHash; //套接字对应线程
QHash<QThread*, QString> userThreadHash; //线程用户
QHash<QThread*, SqlBusiness*> threadSqlHash; //每个线程对应sql实例
private:
USERTYPE m_userType;
QReadWriteLock dbLock;
};
在我的incomingConnection函数中,即在接收到有连接时,我会创建一个工作类SqlBusiness,该类继承自QObject来实现对QT元对象的支持。为了实现多线程运行多个用户连接,我使用了QT的moveToThread()函数,通过new一个QThread对象