QT开发中文网

QTcpServer与QtNetwork的用法详解

QtNetwork是一个网络编程框架,包括了TCP、UDP、HTTP、FTP等协议的支持。QTcpServer是QtNetwork中用于实现TCP服务器的类。

  1. 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. 建立多线程服务器

当服务端需要处理多个客户端请求时,可以采用多线程方式进行处理。具体实现方法如下:

(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();
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=2269

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?