• Roson的Qt之旅 #116 QTcpServer详细介绍


    CSDN话题挑战赛第2期
    参赛话题:Qt应用程序开发


    1.概述

    头文件
    #include  

    .pro文件需添加如下模块
    QT += network

    QTcpServer类提供了一个基于TCP的服务器。

    这个类使得它可以接受传入的TCP连接。你可以指定端口或者让QTcpServer自动选择一个端口。你可以监听一个特定的地址或所有机器的地址。

    调用listen()来让服务器监听传入的连接。每次有客户端连接到服务器时,就会发出newConnection()信号。

    调用nextPendingConnection()来接受作为连接的QTcpSocket的未决连接。该函数返回一个指向QAbstractSocket::ConnectedState中的QTcpSocket的指针,你可以用它来与客户端进行通信。

    如果发生错误,serverError()返回错误的类型,并且可以调用errorString()来获得对发生的事情的可读描述。

    当监听连接时,服务器监听的地址和端口可作为serverAddress()和serverPort()。

    调用close()使得QTcpServer停止监听进入的连接。

    尽管QTcpServer主要是为使用事件循环而设计的,但也有可能在没有事件循环的情况下使用它。在这种情况下,你必须使用waitForNewConnection(),它将阻塞直到有连接可用或超时。

    参见QTcpSocket、Fortune Server实例、Threaded Fortune Server实例、Loopback实例和Torrent实例。

    2.成员函数说明

    QTcpServer::QTcpServer(QObject *parent = Q_NULLPTR)

    构建一个QTcpServer对象。
    parent被传递给QObject构造函数。
    参见listen()和setSocketDescriptor()。

    [virtual] QTcpServer::~QTcpServer()

    销毁QTcpServer对象。如果服务器正在监听连接,那么套接字将被自动关闭。
    任何仍在连接的客户端QTcpSockets必须在服务器被删除之前断开连接或被重新托管。
    参见close()。

    [signal] void QTcpServer::acceptError(QAbstractSocket::SocketError socketError)

    当接受一个新的连接导致一个错误时,这个信号会被发出。socketError参数描述了发生错误的类型。
    这个函数在Qt 5.0中引入。
    参见pauseAccepting() 和 resumeAccepting()。

    [protected] void QTcpServer::addPendingConnection(QTcpSocket *socket)

    这个函数被QTcpServer::incomingConnection()调用,以将套接字添加到待定的传入连接列表中。
    注意:如果你不想破坏挂起连接机制,不要忘记从重新实现的incomingConnection()中调用这个成员。
    这个函数是在Qt 4.7中引入的。
    参见incomingConnection()。

    void QTcpServer::close()

    关闭服务器。该服务器将不再监听进入的连接。
    参见listen()。

    QString QTcpServer::errorString() const

    返回最后发生的错误的可读描述。
    参见serverError()。

    [virtual] bool QTcpServer::hasPendingConnections() const

    如果服务器有一个挂起的连接,返回true;否则返回false。
    另见 nextPendingConnection() 和 setMaxPendingConnections()。

    [virtual protected] void QTcpServer::incomingConnection(qintptr socketDescriptor)

    当一个新的连接可用时,这个虚拟函数被QTcpServer调用。socketDescriptor参数是所接受的连接的本地套接字描述符。
    基本实现会创建一个QTcpSocket,设置套接字描述符,然后将QTcpSocket存储在一个内部的待定连接列表中。最后,newConnection()被发出。
    重新实现这个函数以改变服务器在有连接时的行为。
    如果这个服务器使用的是QNetworkProxy,那么socketDescriptor可能无法使用本地的套接字函数,而应该只使用QTcpSocket::setSocketDescriptor()。
    注意:如果在这个方法的重新实现中创建了另一个套接字,需要通过调用addPendingConnection()将其添加到待定连接机制中。
    注意:如果你想在另一个线程中作为一个新的QTcpSocket对象处理一个传入的连接,你必须将socketDescriptor传递给另一个线程,并在那里创建QTcpSocket对象,并使用其setSocketDescriptor()方法。
    另请参阅newConnection(), nextPendingConnection(), and addPendingConnection()。

    bool QTcpServer::isListening() const

    如果服务器当前正在监听传入的连接,返回true;否则返回false。
    参见listen()。

    bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)

    告诉服务器在地址和端口上监听进入的连接。如果端口是0,会自动选择一个端口。如果地址是QHostAddress::Any,服务器将在所有网络接口上监听。
    成功时返回真,否则返回假。
    参见isListening()。

    int QTcpServer::maxPendingConnections() const

    返回等待接受的最大连接数。默认为30。
    另请参阅setMaxPendingConnections()和hasPendingConnections()。

    [signal] void QTcpServer::newConnection()

    每次有新的连接时都会发出这个信号。
    也请参见hasPendingConnections()和nextPendingConnection()。

    [virtual] QTcpSocket *QTcpServer::nextPendingConnection()

    将下一个悬而未决的连接作为一个连接的QTcpSocket对象返回。
    该套接字是作为服务器的一个子节点创建的,这意味着当QTcpServer对象被销毁时,它会被自动删除。当你用完这个对象时,明确地删除它仍然是一个好主意,以避免浪费内存。
    如果在没有未决连接时调用这个函数,则返回0。
    注意:返回的QTcpSocket对象不能被其他线程使用。如果你想使用来自另一个线程的传入连接,你需要重写incomingConnection()。
    另请参阅hasPendingConnections()。

    void QTcpServer::pauseAccepting()

    暂停接受新的连接。排队的连接将保持在队列中。
    这个函数在Qt 5.0中引入。
    参见 resumeAccepting()。

    QNetworkProxy QTcpServer::proxy() const

    返回此套接字的网络代理。默认情况下,使用QNetworkProxy::DefaultProxy。
    这个函数在Qt 4.1中引入。
    参见setProxy()和QNetworkProxy。

    void QTcpServer::resumeAccepting()

    恢复接受新的连接。
    这个函数在Qt 5.0中引入。
    参见pauseAccepting()。

    QHostAddress QTcpServer::serverAddress() const

    如果服务器正在监听连接,返回服务器的地址;否则返回QHostAddress::Null。
    另见serverPort()和listen()。

    QAbstractSocket::SocketError QTcpServer::serverError() const

    返回最后发生的错误的错误代码。
    参见errorString()。

    quint16 QTcpServer::serverPort() const

    如果服务器正在监听连接,返回服务器的端口;否则返回0。
    参见serverAddress() 和 listen()。

    void QTcpServer::setMaxPendingConnections(int numConnections)

    将待接受的连接的最大数量设为numConnections。在调用 nextPendingConnection() 之前,QTcpServer 将接受不超过 numConnections 的传入连接。默认情况下,该限制是30个未决连接。
    在服务器达到其最大的待连接数之后,客户仍然能够连接(即 QTcpSocket 仍然能够发出 connected() 信号)。QTcpServer将停止接受新的连接,但操作系统可能仍然将它们保留在队列中。
    请参见maxPendingConnections()和hasPendingConnections()。

    void QTcpServer::setProxy(const QNetworkProxy &networkProxy)

    将此套接字的显式网络代理设置为networkProxy。
    要禁止对该套接字使用代理,请使用QNetworkProxy::NoProxy代理类型。:

      server->setProxy(QNetworkProxy::NoProxy);

    这个函数在Qt 4.1中被引入。
    参见proxy()和QNetworkProxy。

    bool QTcpServer::setSocketDescriptor(qintptr socketDescriptor)

    设置此服务器在监听socketDescriptor的传入连接时应使用的套接字描述符。如果套接字被成功设置,返回true;否则返回false。
    该套接字被假定为处于监听状态。
    另请参阅socketDescriptor()和isListening()。

    qintptr QTcpServer::socketDescriptor() const

    返回服务器用来监听传入指令的本地套接字描述符,如果服务器没有监听,则返回-1。
    如果服务器使用QNetworkProxy,返回的描述符可能无法使用本地套接字函数。
    参见setSocketDescriptor()和isListening()。

    bool QTcpServer::waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR)

    最多等待msec毫秒或直到有一个传入的连接可用。如果有连接可用,返回true;否则返回false。如果操作超时并且timedOut不是0,*timedOut将被设置为true。
    这是一个阻塞性的函数调用。在单线程的GUI应用程序中,它的使用是不利的,因为整个应用程序将停止响应,直到该函数返回。 waitForNewConnection()在没有事件循环的情况下是非常有用的。
    非阻塞的选择是连接到newConnection()信号。
    如果msec为-1,这个函数将不会超时。
    另见hasPendingConnections()和nextPendingConnection()。

  • 相关阅读:
    【WPF】附加事件
    DataX数据同步
    从零搭建基于SpringCloud Alibaba 鉴权中心服务(详细教程)
    【postgresql 基础入门】数据表的查询基本知识,条件过滤、单列多列排序、按页浏览数据、数据去重,得到你想要的数据
    风、光、柴油机、蓄电池、电网交互微电网经济调度优化问题研究附Matlab代码
    数据链路层协议
    js控制checkbox单选,获取checkbox的值,选中checkbox
    Word修订内容批量标红
    如何用BigDecimal定义数字
    (七)C++中实现argmin与argmax
  • 原文地址:https://blog.csdn.net/jolin678/article/details/126878171