QTcpServer Class
QTcpServer 类提供了一个基于 TCP 的服务器。更多
Header: | #include <QTcpServer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
qmake: | QT += network |
继承: | QObject |
继承于 |
- 所有成员的列表,包括继承成员
- QTcpServer 是网络编程 API 的一部分。
注意:该类中的所有函数都是可重入的。
公共函数
QTcpServer(QObject *parent = nullptr) | |
virtual | ~QTcpServer() |
void | close() |
QString | errorString() const |
virtual bool | hasPendingConnections() const |
bool | isListening() const |
bool | listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0) |
(since 6.3) int | listenBacklogSize() const |
int | maxPendingConnections() const |
virtual QTcpSocket * | nextPendingConnection() |
void | pauseAccepting() |
QNetworkProxy | proxy() const |
void | resumeAccepting() |
QHostAddress | serverAddress() const |
QAbstractSocket::SocketError | serverError() const |
quint16 | serverPort() const |
(since 6.3) void | setListenBacklogSize(int size) |
void | setMaxPendingConnections(int numConnections) |
void | setProxy(const QNetworkProxy &networkProxy) |
bool | setSocketDescriptor(qintptr socketDescriptor) |
qintptr | socketDescriptor() const |
bool | waitForNewConnection(int msec = 0, bool *timedOut = nullptr) |
信号
void | acceptError(QAbstractSocket::SocketError socketError) |
void | newConnection() |
(since 6.4) void | pendingConnectionAvailable() |
保护函数
void | addPendingConnection(QTcpSocket *socket) |
virtual void | incomingConnection(qintptr socketDescriptor) |
详细说明
该类用于接受传入的 TCP 连接。您可以指定端口,也可以让 QTcpServer 自动选择端口。您可以监听特定地址,也可以监听所有机器的地址。
调用listen() 可让服务器监听传入连接。然后,每次客户端连接到服务器时,都会发出newConnection() 信号。使用addPendingConnection() 函数将客户端连接添加到待处理连接队列后,就会发出pendingConnectionAvailable() 信号。
调用nextPendingConnection() 接受挂起的连接为已连接的QTcpSocket 。该函数返回一个指向QAbstractSocket::ConnectedState 中QTcpSocket 的指针,您可以使用该指针与客户端通信。
如果发生错误,serverError() 会返回错误类型,调用errorString() 可以获得关于发生错误的可读描述。
在监听连接时,服务器监听的地址和端口可通过serverAddress() 和serverPort() 获得。
调用close() 会使 QTcpServer 停止监听传入连接。
虽然 QTcpServer 主要是为与事件循环一起使用而设计的,但也可以在没有事件循环的情况下使用。在这种情况下,您必须使用waitForNewConnection() ,它会一直阻塞,直到有连接可用或超时。
另请参阅 QTcpSocket 、财富服务器、线程财富服务器和Torrent 示例。
成员函数文档
[explicit]
QTcpServer::QTcpServer(QObject *parent = nullptr)
构造一个 QTcpServer 对象。
parent 传递给 构造函数。QObject
另请参阅 listen() 和setSocketDescriptor() 。
[virtual noexcept]
QTcpServer::~QTcpServer()
销毁QTcpServer 对象。如果服务器正在监听连接,则会自动关闭套接字。
任何仍在连接的QTcpSocket客户端必须在服务器被删除前断开连接或重新连接。
另请参阅 close().
[signal]
void QTcpServer::acceptError(QAbstractSocket::SocketError socketError)
当接受新连接导致错误时,会发出该信号。socketError 参数描述了发生错误的类型。
另请参阅 pauseAccepting() 和resumeAccepting()。
[protected]
void QTcpServer::addPendingConnection(QTcpSocket *socket)
QTcpServer::incomingConnection() 调用该函数,将socket 添加到待处理传入连接列表中。
注意: 如果不想破坏待处理连接机制,请不要忘记从重新实现的incomingConnection() 中调用该成员。该函数会在添加套接字后发出pendingConnectionAvailable() 信号。
另请参阅 incomingConnection() 和pendingConnectionAvailable()。
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() 和addPendingConnection()。
bool QTcpServer::isListening() const
如果服务器当前正在监听传入连接,则返回true
;否则返回false
。
另请参阅 listen() 。
bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
告诉服务器监听地址address 和端口port 上的传入连接。如果port 为 0,则会自动选择一个端口。如果address 为QHostAddress::Any ,服务器将监听所有网络接口。
成功时返回true
,否则返回false
。
另请参阅 isListening() 。
[since 6.3]
int QTcpServer::listenBacklogSize() const
返回待接受连接的积压队列大小。
此函数在 Qt 6.3 中引入。
另请参阅 setListenBacklogSize()。
int QTcpServer::maxPendingConnections() const
返回待接受连接的最大数量。默认为 30。
另请参阅 setMaxPendingConnections() 和hasPendingConnections()。
[signal]
void QTcpServer::newConnection()
每次有新连接可用时都会发出该信号,无论该连接是否已添加到待处理连接队列中。
另请参阅 hasPendingConnections() 和nextPendingConnection()。
[virtual]
QTcpSocket *QTcpServer::nextPendingConnection()
以已连接QTcpSocket 对象的形式返回下一个待处理连接。
套接字是作为服务器的子对象创建的,这意味着当QTcpServer 对象被销毁时,它会被自动删除。为避免浪费内存,最好还是在使用完该对象后明确删除它。
nullptr
如果在没有待处理连接的情况下调用此函数,则返回 。
注意: 返回的QTcpSocket 对象不能在其他线程中使用。如果要使用从其他线程传入的连接,需要重载incomingConnection()。
另请参阅 hasPendingConnections()。
void QTcpServer::pauseAccepting()
暂停接受新连接。队列中的连接将保留在队列中。
另请参阅 resumeAccepting()。
[private signal, since 6.4]
void QTcpServer::pendingConnectionAvailable()
每次有新连接加入待处理连接队列时,都会发出该信号。
注意: 这是一个私有信号。它可以在信号连接中使用,但不能由用户发出。
此函数在 Qt 6.4 中引入。
另请参阅 hasPendingConnections() 和nextPendingConnection()。
QNetworkProxy QTcpServer::proxy() const
返回此套接字的网络代理。默认情况下使用QNetworkProxy::DefaultProxy 。
另请参阅 setProxy() 和QNetworkProxy 。
void QTcpServer::resumeAccepting()
恢复接受新连接。
另请参见 pauseAccepting().
QHostAddress QTcpServer::serverAddress() const
如果服务器正在监听连接,则返回服务器地址;否则返回QHostAddress::Null 。
另请参阅 serverPort() 和listen()。
QAbstractSocket::SocketError QTcpServer::serverError() const
返回上次出错的错误代码。
另请参见 errorString()。
quint16 QTcpServer::serverPort() const
如果服务器正在监听连接,则返回服务器的端口;否则返回 0。
另请参阅 serverAddress() 和listen()。
[since 6.3]
void QTcpServer::setListenBacklogSize(int size)
将待接受连接的积压队列大小设置为size 。操作系统可能会减少或忽略此值。默认情况下,队列大小为 50。
注意: 必须在调用listen() 之前设置此属性。
此函数在 Qt 6.3 中引入。
另请参阅 listenBacklogSize()。
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);
另请参阅 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 = nullptr)
最多等待msec 毫秒,或直到有输入连接可用。如果连接可用,则返回true
;否则返回false
。如果操作超时且timedOut 不是nullptr
,*timedOut 将被设置为 true。
这是一个阻塞函数调用。waitForNewConnection() 在没有事件循环的情况下非常有用。
非阻塞的替代方法是连接到newConnection() 信号。
如果 msec 为-1,则该函数不会超时。
另请参阅 hasPendingConnections() 和nextPendingConnection()。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.