CSDN话题挑战赛第2期
参赛话题:Qt应用程序开发
头文件
#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实例。
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()。