QtNetwork是一个网络编程框架,包括了TCP、UDP、HTTP、FTP等协议的支持。QTcpServer是QtNetwork中用于实现TCP服务器的类。
- QTcpServer的基本使用
(1)创建服务器对象
在Qt中,可以通过QHostAddress::Any和0作为参数来创建服务器对象:
// 创建服务器对象
QTcpServer *server = new QTcpServer(this);
// 监听所有IPv4地址和任意端口号
server->listen(QHostAddress::Any, 0);
(2)接受连接请求
在监听到客户端发起连接请求后,需要调用nextPendingConnection()方法获取新建立的连接:
// 当有新的客户端连接时触发此函数
void onNewConnection()
{
// 获取新建立的连接
QTcpSocket *socket = server->nextPendingConnection();
}
(3)发送数据
可以通过QTcpSocket类提供的write()函数将数据发送给客户端:
void sendData(QTcpSocket *socket)
{
QByteArray data("Hello World!");
socket->write(data);
}
- 建立多线程服务器
当服务端需要处理多个客户端请求时,可以采用多线程方式进行处理。具体实现方法如下:
(1)继承QTcpServer并重写incomingConnection()函数。这个函数会在每次有新连接到来时被调用。
class MyTcpServer : public QTcpServer
{
protected:
void incomingConnection(qintptr socketDescriptor) override;
};
void MyTcpServer::incomingConnection(qintptr socketDescriptor)
{
// 创建新线程
QThread *thread = new QThread(this);
// 创建新的socket对象,并将其放入新线程中
MyTcpSocket *socket = new MyTcpSocket(socketDescriptor);
socket->moveToThread(thread);
// 连接信号和槽函数,用于在线程结束后释放资源
connect(thread, &QThread::finished, thread, &QObject::deleteLater);
connect(thread, &QThread::finished, socket, &QObject::deleteLater);
// 启动线程并连接客户端请求处理函数
thread->start();
}
(2)在MyTcpSocket类中重写readyRead()和disconnected()函数,用于处理客户端数据和断开连接事件。
class MyTcpSocket : public QTcpSocket
{
public:
MyTcpSocket(qintptr socketDescriptor) : QTcpSocket(nullptr)
{ setSocketDescriptor(socketDescriptor); }
protected slots:
void readyRead();
void disconnected();
};
void MyTcpSocket::readyRead()
{
QByteArray data = readAll();
...
}
void MyTcpSocket::disconnected()
{
close();
}
(3)在主函数中创建服务器对象并启动监听:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
...
MyTcpServer server;
server.listen(QHostAddress::AnyIPv4, 1234);
return a.exec();
}