Qt网络编程:QNetworkSession

一、描述

QNetworkSession 封装网络会话。会话的配置参数是通过它所绑定的 QNetworkConfiguration 对象确定的。 根据会话的类型(单个接入点或服务网络),会话可能会链接到一个或多个网络接口。 通过打开和关闭网络会话,开发人员可以启动和停止系统网络接口。

如果配置代表多个接入点(QNetworkConfiguration::ServiceNetwork),则可能支持更高级的功能,例如漫游。

QNetworkSession 支持同一进程内的会话管理,并且根据平台的功能可能支持进程外会话。 如果多个打开的会话使用相同的网络配置,则仅在最后一个会话关闭后才终止底层网络接口。

1.1、漫游

应用程序可以连接到 preferredConfigurationChanged() 信号,以便在更合适的接入点可用时接收通知。 响应此信号,应用程序必须通过 migrate() 或 ignore() 新接入点启动漫游。一旦会话漫游,就会发出 newConfigurationActivated() 信号。应用程序现在可以测试载体并且必须 accept() 或reject() 它。 如果漫游被拒绝,会话将返回到之前的接入点。

某些平台可能会区分强制漫游和应用程序级漫游 (ALR)。 ALR 意味着应用程序控制(通过 migrate()、ignore()、accept() 和 reject())网络会话是否可以从一个接入点漫游到下一个接入点。强制漫游意味着系统自动漫游到下一个网络而无需咨询应用程序。这样做的优点是应用程序可以使用漫游功能而实际上并不知道它。预计应用程序检测到底层socket已损坏并通过新的网络链接自动重新连接。


二、类型成员

1、enum QNetworkSession::SessionError:此枚举描述了可能发生的会话错误。

  • UnknownSessionError:发生不明错误。
  • SessionAbortedError:会话被用户或系统中止。
  • RoamingError:会话无法漫游到新配置。
  • OperationNotSupportedError:当前配置不支持该操作。
  • InvalidConfigurationError:当前无法为当前配置执行该操作。

2、enum QNetworkSession::State:此枚举描述会话的连接状态。

  • Invalid:配置无效导致会话无效。这可能是由于移除的接入点或一开始无效的配置而发生的。
  • NotAvailable:会话基于已定义但尚未发现的 QNetworkConfiguration(QNetworkConfiguration::StateFlag)。
  • Connecting:正在建立网络会话。
  • Connected:网络会话已连接。
  • Closing:网络会话正在关闭。
  • Disconnected:网络会话未连接。 关联的 QNetworkConfiguration 状态为 QNetworkConfiguration::Discovered
  • Roaming:网络会话从一个接入点漫游到另一个接入点。

3、enum QNetworkSession::UsagePolicy:此枚举允许系统通知应用程序可能存在的网络使用限制。

  • NoPolicy:不受限制。
  • NoBackgroundTrafficPolicy:应避免后台网络流量(不是用户发起的),例如节省电量。

三、成员函数

1、void accept()

会话永久接受新的接入点。如果没有其他网络会话,旧接入点可能会在此过程中关闭。

2、void close()

减少相关网络配置上的会话计数器。如果会话计数器达到零,则活动网络接口将关闭。 这意味着如果当前会话是最后一个打开的会话,state() 会从 Connected 更改为 Disconnected

如果平台不支持进程外会话,调用此函数不会停止接口。在这种情况下,必须使用 stop() 强制关闭。 可以通过 QNetworkConfigurationManager::capabilities() 检测平台功能。

此函数是异步的。可以通过连接到 stateChanged()、opened() 或 error() 信号来查询结果。

3、[signal] void closed()

当网络会话关闭时发出此信号。

4、[signal] void error(QNetworkSession::SessionError error)

发生错误后发出此信号。 error 参数描述了发生的错误。

connect(networkSession, QOverload<QNetworkSession::SessionError>::of(&QNetworkSession::error),[=](QNetworkSession::SessionError error)
{});

5、void ignore()

此函数表示应用程序不希望漫游会话。

6、void migrate()

指示会话漫游到新的接入点。旧的接入点一直保持活动状态,直到应用程序调用 accept()。一旦漫游完成,就会发出 newConfigurationActivated() 信号。

7、[signal] void newConfigurationActivated()

一旦会话漫游到新的接入点,就会发出这个信号。应用程序可以重新打开其套接字并测试新网络链接的适用性。 随后它必须accept()或reject()新的接入点。

8、void open()

创建一个打开的会话,增加底层网络接口上的会话计数器。在会话引用计数器达到零之前,系统不会终止网络接口。 因此,开放会话允许应用程序注册其对接口的使用。

作为调用 open() 的结果,如果接口尚未连接/启动,则该接口将被启动。某些平台可能不支持进程外会话。 在此类平台上,会话计数器会忽略其他进程持有的任何会话。可以通过 QNetworkConfigurationManager::capabilities() 检测平台功能。

此函数是异步的。可以通过连接到 stateChanged()、opened() 或 error() 信号来查询结果。

9、[signal] void opened()

当网络会话打开时发出此信号。

只要会话保持打开状态,底层网络接口就不会关闭。此功能取决于系统范围的会话支持。

10、[signal] void preferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless)

当会话的首选配置/接入点更改时,会发出此信号。只有基于QNetworkConfiguration::ServiceNetwork的会话才能发出此信号。config 可用于确定接入点特定的详细信息,例如代理设置,并且 isSeamless 指示漫游是否会破坏会话 IP 地址。

作为此信号的结果,应用程序必须通过调用 migrate() 或选择 ignore() 新接入点来启动漫游过程。

某些平台可能支持强制漫游和应用级漫游 (ALR) 的概念。

  • 强制漫游意味着平台可以简单地漫游到新配置而无需咨询应用程序。由应用程序来检测链路层丢失并重新建立其socket。
  • ALR 防止系统漫游。

如果此会话基于支持漫游的配置,则应用程序可以通过连接到此信号来选择是否要咨询(ALR 用例)。只要该信号连接保持不变,会话就保持注册为漫游涉众,否则平台将强制漫游。

11、void reject()

新接入点不适合该应用程序。通过调用这个函数,会话返回到之前的接入点/配置。 

12、[signal] void stateChanged(QNetworkSession::State state)

每当网络会话的状态发生变化时,就会发出此信号。参数是新状态。

13、void stop()

使针对网络接口的所有打开会话无效,从而停止底层网络接口。 此函数始终将会话的 state() 标志更改为Disconnected

14、[signal] void usagePoliciesChanged(QNetworkSession::UsagePolicies usagePolicies)

当系统修改QNetworkSession::UsagePolicy时,会发出此信号。

15、quint64 activeTime()

返回会话处于活动状态的秒数。

16、quint64 bytesReceived()

返回接收到的数据量(以字节为单位)。此字段值包括使用相同网络接口的所有开放网络会话的使用情况。如果会话基于QNetworkConfiguration::ServiceNetwork配置,则返回所有活动成员配置中发送的字节数。

此函数可能并非总是在所有平台上都受支持并返回 0。可以通过 QNetworkConfigurationManager::DataStatistics 检测平台功能。

17、quint64 bytesWritten()

返回以字节为单位发送的数据量。此字段值包括使用相同网络接口的所有开放网络会话的使用情况。如果会话基于QNetworkConfiguration::ServiceNetwork配置,则返回所有活动成员配置中发送的字节数。

此函数可能并非总是在所有平台上都受支持并返回 0。可以通过 QNetworkConfigurationManager::DataStatistics 检测平台功能。

18、QNetworkConfiguration configuration()

返回此网络会话对象所基于的 QNetworkConfiguration。

19、QNetworkInterface interface()

返回此会话使用的网络接口。此函数仅在此会话已连接时返回有效的网络接口。返回的接口可能会因漫游过程而改变。

20、bool isOpen()

如果此会话已打开,则返回 true。 如果所有打开的会话数大于零,则底层网络接口将保持连接/开启。会话可以通过 open() 和 close() 进行控制。

21、QVariant sessionProperty(const QString &key) 

返回属性键的值。网络会话可以附加属性,这些属性可以更详细地描述会话。 此函数可用于访问这些属性。

属性键如下:

  • ActiveConfiguration:如果会话 isOpen() 此属性返回此会话使用的 QNetworkConfiguration 的标识符,否则为空字符串。此键的主要目的是确定在会话基于 QNetworkConfiguration::ServiceNetwork 时使用哪个 Internet 接入点。
     QNetworkConfigurationManager mgr;
     QNetworkConfiguration ap = mgr.defaultConfiguration();
     QNetworkSession *session = new QNetworkSession(ap);

     QString ident = session->sessionProperty("ActiveConfiguration").toString();
     if ( ap.type() == QNetworkConfiguration::ServiceNetwork )
     {
         Q_ASSERT( ap.identifier() != ident );
         Q_ASSERT( ap.children().contains( mgr.configurationFromIdentifier(ident) ) );
     } 
     else if ( ap.type() == QNetworkConfiguration::InternetAccessPoint ) 
     {
         Q_ASSERT( ap.identifier() == ident );
     }
  • UserChoiceConfiguration:如果会话isOpen() 并且绑定到 QNetworkConfiguration::UserChoice类型的 QNetworkConfiguration,则此属性返回调用 open() 时配置解析为的 QNetworkConfiguration 的标识符,否则为空字符串。此键的目的是确定会话正在使用的真实 QNetworkConfiguration。 此键与 ActiveConfiguration 的不同之处在于,此键可能返回服务网络或 Internet 访问点配置的标识符,而 ActiveConfiguration 始终返回 Internet 访问点配置的标识符。
  • ConnectInBackground:在调用 open() 之前将此属性设置为 true 意味着进行了连接尝试,但如果无法建立连接,则不会咨询用户并要求用户选择合适的连接。
  • AutoCloseSessionTimeout:如果会话需要轮询以使其状态保持最新,则此属性将在会话自动关闭之前以毫秒为单位保持超时。 如果此属性的值为 -1,会话将不会自动关闭。默认情况下,此属性设置为 -1。此属性的目的是最大限度地减少使用轮询更新会话状态的平台上的资源使用。应用程序可以在会话关闭之前将此属性的值设置为所需的超时时间。响应 close() 信号时应删除网络会话以确保停止所有轮询。一旦再次需要该会话,就可以重新创建该会话。此属性对不需要轮询的会话没有影响。

22、void setSessionProperty(const QString &key, const QVariant &value)

设置会话的属性值。可以通过传递无效的 QVariant 来移除已经设置的属性。请注意,UserChoiceConfiguration ActiveConfiguration 属性是只读的,不能使用此方法更改。

23、QNetworkSession::State state()

返回会话的状态。

如果会话基于单个接入点配置,则会话状态与关联网络接口的状态相同。 因此,网络会话对象可用于监视网络接口。

基于 QNetworkConfiguration::ServiceNetwork 的会话总结其所有子级的状态,因此如果至少有一个服务网络的 QNetworkConfiguration::children() 配置处于活动状态,则返回 Connected 状态。

请注意,不需要为了获取网络接口状态而保持打开会话。已连接但已关闭的会话可用于监视网络接口,而打开且已连接的会话对象可防止网络接口被关闭。

24、bool waitForOpened(int msecs = 30000)

等待直到会话打开,最多 msecs 毫秒。如果会话已打开此函数返回 true。在返回false的情况下,可以调用error()来确定错误的原因。如果 msecs 为 -1,则此函数不会超时。

以下示例最多等待一秒钟以打开会话:

     session->open();
     if (session->waitForOpened(1000))
         qDebug("Open!");
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值