<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # QNetworkSession Class Reference ## [[QtNetwork](index.htm) module] 該QNetworkSession類提供對系統的接入點控制,使會話管理的情況下,當多個客戶端訪問同一個接入點。[More...](#details) 繼承[QObject](qobject.html)。 ### Types * `enum SessionError { UnknownSessionError, SessionAbortedError, RoamingError, OperationNotSupportedError, InvalidConfigurationError }` * `enum State { Invalid, NotAvailable, Connecting, Connected, ..., Roaming }` ### Methods * `__init__ (self, QNetworkConfiguration?connConfig, QObject?parent?=?None)` * `accept (self)` * `int activeTime (self)` * `int bytesReceived (self)` * `int bytesWritten (self)` * `close (self)` * `QNetworkConfiguration configuration (self)` * `connectNotify (self, SIGNAL()?signal)` * `disconnectNotify (self, SIGNAL()?signal)` * `SessionError error (self)` * `QString errorString (self)` * `ignore (self)` * `QNetworkInterface interface (self)` * `bool isOpen (self)` * `migrate (self)` * `open (self)` * `reject (self)` * `QVariant sessionProperty (self, QString?key)` * `setSessionProperty (self, QString?key, QVariant?value)` * `State state (self)` * `stop (self)` * `bool waitForOpened (self, int?msecs?=?30000)` ### Qt Signals * `void closed ()` * `void error (QNetworkSession::SessionError)` * `void newConfigurationActivated ()` * `void opened ()` * `void preferredConfigurationChanged (const QNetworkConfiguration&,bool)` * `void stateChanged (QNetworkSession::State)` * * * ## Detailed Description 該QNetworkSession類提供對系統的接入點控制,使會話管理的情況下,當多個客戶端訪問同一個接入點。 一個QNetworkSession使得在系統的網絡接口控制。會話的配置參數是通過確定[QNetworkConfiguration](qnetworkconfiguration.html)對象,其中就必然。根據會話的類型(單一的接入點或網絡服務)的會話可以被鏈接到一個或多個網絡接口。借[opening](qnetworksession.html#open)和[closing](qnetworksession.html#close)網絡課程的開發者可以啟動和停止系統的網絡接口。如果該結構代表多個接入點(見[QNetworkConfiguration.ServiceNetwork](qnetworkconfiguration.html#Type-enum))更先進的功能,例如漫游可能得到支持。 QNetworkSession支持會話管理同一進程內的,并根據平臺的功能可支持外的過程的會話。如果同一個網絡配置使用多個打開的會話,一旦最后一個會話已經關閉了底層網絡接口僅終止。 ### Roaming 應用程序可以連接到[preferredConfigurationChanged](qnetworksession.html#preferredConfigurationChanged)()信號,以便接收通知時,更合適的接入點成為可用的。響應于該信號的應用程序必須或者發起漫游經由[migrate](qnetworksession.html#migrate)()或[ignore](qnetworksession.html#ignore)( )新的接入點。一旦會話已漫游[newConfigurationActivated](qnetworksession.html#newConfigurationActivated)()信號被發射。該應用程序現在可以測試載體和必須要么[accept](qnetworksession.html#accept)()或[reject](qnetworksession.html#reject)( )它。會議將返回到先前的接入點,如果漫游遭到拒絕。隨后的狀態圖描述了所需要的狀態轉換。 ![](https://img.kancloud.cn/48/f7/48f704e2679b6e70ba7bece0710a2487_569x391.png) 有些平臺可能區分強制漫游和應用層漫游( ALR ) 。 ALR意味著應用控制(通過[migrate](qnetworksession.html#migrate)( )[ignore](qnetworksession.html#ignore)( )[accept](qnetworksession.html#accept)()和[reject](qnetworksession.html#reject)())是否在網絡會話可以從一個接入點漫游到下一個。如果應用程序保持狀態的套接字連接,并要控制從一個接口到下一個過渡這樣的控制是有用的。強制漫游意味著系統會自動漫游到下一個網絡沒有諮詢該應用程序。這樣做的好處是應用程序可以利用漫游功能,而實際上是意識到這一點。預期的應用程序檢測到相關插座被打破,并自動通過新的網絡鏈路重新連接。 如果平臺支持漫游的兩種模式,一個應用程序通過連接到顯示其偏好[preferredConfigurationChanged](qnetworksession.html#preferredConfigurationChanged)()信號。連接到這個信號意味著該應用程序要接管漫游行為的控制,因此意味著應用程序級的漫游。如果客戶端無法連接到[preferredConfigurationChanged](qnetworksession.html#preferredConfigurationChanged)( ) ,強制漫游使用。如果不支持強制漫游網絡會話將默認不漫游。 有些應用程序可能要抑制任何形式的漫游完全的。可能的用例可能是高優先級下載或遠程服務無法處理漫游功能的客戶端。客戶可以通過連接到抑制漫游[preferredConfigurationChanged](qnetworksession.html#preferredConfigurationChanged)( )信號,并回答與每個信號發射[ignore](qnetworksession.html#ignore)( ) 。 * * * ## Type Documentation ``` QNetworkSession.SessionError ``` 這個枚舉說明可能發生的會話錯誤。 | Constant | Value | Description | | --- | --- | --- | | `QNetworkSession.UnknownSessionError` | `0` | 發生不明的錯誤。 | | `QNetworkSession.SessionAbortedError` | `1` | 這次會議是由用戶中止或系統。 | | `QNetworkSession.RoamingError` | `2` | 會話不能漫游到一個新的配置。 | | `QNetworkSession.OperationNotSupportedError` | `3` | 不支持當前配置的操作。 | | `QNetworkSession.InvalidConfigurationError` | `4` | 目前無法對當前配置進行操作。 | ``` QNetworkSession.State ``` 這個枚舉變量描述了會話的連接狀態。如果會話是基于一個單一的訪問點配置會話的狀態是一樣的相關網絡接口的狀態。 | Constant | Value | Description | | --- | --- | --- | | `QNetworkSession.Invalid` | `0` | 這次會議是由于無效的配置無效。這可能會發生因已移除接入點或者是無效的,開始與配置。 | | `QNetworkSession.NotAvailable` | `1` | 這次會議是基于一個定義,但尚未發現[QNetworkConfiguration](qnetworkconfiguration.html)(見[QNetworkConfiguration.StateFlag](qnetworkconfiguration.html#StateFlag-enum)) 。 | | `QNetworkSession.Connecting` | `2` | 網絡會話正在建立。 | | `QNetworkSession.Connected` | `3` | 網絡會話連接。如果當前進程想使用這個會話它通過調用注冊其興趣[open](qnetworksession.html#open)( ) 。網絡會話被認為是準備好套接字操作,如果它[isOpen](qnetworksession.html#isOpen)()和連接。 | | `QNetworkSession.Closing` | `4` | 網絡會話處于被關閉的過程。 | | `QNetworkSession.Disconnected` | `5` | 網絡會話沒有連接。相關[QNetworkConfiguration](qnetworkconfiguration.html)有狀態[QNetworkConfiguration.Discovered](qnetworkconfiguration.html#StateFlag-enum)。 | | `QNetworkSession.Roaming` | `6` | 所述網絡會話是從一個接入點漫游到另一個接入點。 | * * * ## Method Documentation ``` QNetworkSession.__init__ (self, QNetworkConfiguration?connConfig, QObject?parent?=?None) ``` 該_parent_的說法,如果不是沒有,原因_self_通過Qt的,而不是PyQt的擁有。 構造一個會話的基礎上_connectionConfig_用給定的_parent_。 **See also** [QNetworkConfiguration](qnetworkconfiguration.html)。 ``` QNetworkSession.accept (self) ``` 這種方法也是一個Qt槽與C + +的簽名`void accept()`。 指示會話永久接受新的接入點。一旦該功能被稱為會話可能不會返回到舊的接入點。 舊的接入點可以在這一過程中被關閉,如果有針對它沒有其它的網絡會話。因此,仍然使用舊的接入點的任何打開的socket可能變得不穩定,并完成遷移之前,應該關閉。 ``` int QNetworkSession.activeTime (self) ``` 返回該會話一直活躍的秒數。 ``` int QNetworkSession.bytesReceived (self) ``` 返回字節接收到的數據量,否則為0 。 該字段值包括其兩端使用相同的網絡接口的所有開放式網絡會話使用。 如果會話是基于服務的網絡配置在所有活動成員配置發送的字節數返回。 此功能可能并不總是在所有平臺上,并返回0的支持。可以通過檢測到該平臺的能力[QNetworkConfigurationManager.DataStatistics](qnetworkconfigurationmanager.html#Capability-enum)。 **Note:**在某些平臺上,此功能可能運行主事件循環。 ``` int QNetworkSession.bytesWritten (self) ``` 返回以字節為單位發送的數據量,否則為0 。 該字段值包括其兩端使用相同的網絡接口的所有開放式網絡會話使用。 如果會話是基于服務的網絡配置在所有活動成員配置發送的字節數返回。 此功能可能并不總是在所有平臺上,并返回0的支持。可以通過檢測到該平臺的能力[QNetworkConfigurationManager.DataStatistics](qnetworkconfigurationmanager.html#Capability-enum)。 **Note:**在某些平臺上,此功能可能運行主事件循環。 ``` QNetworkSession.close (self) ``` 這種方法也是一個Qt槽與C + +的簽名`void close()`。 減少對相關的網絡配置的會話計數器。如果會話計數器歸零活動的網絡接口被關閉。這也意味著[state](qnetworksession.html#state)()將只從改變[Connected](qnetworksession.html#State-enum)至[Disconnected](qnetworksession.html#State-enum)如果當前會話是最后打開的會話。 如果平臺不支持外的會話過程中調用此函數不停止的接口。在這種情況下[stop](qnetworksession.html#stop)( )已被用來強制關閉。該平臺的能力可通過被檢測[QNetworkConfigurationManager.capabilities](qnetworkconfigurationmanager.html#capabilities)( ) 。 注意,這個調用是異步的。根據此調用的結果的結果可以通過連接到被詢問[stateChanged](qnetworksession.html#stateChanged)( )[opened](qnetworksession.html#opened)()或[error](qnetworksession.html#error)( )信號。 **See also** [open](qnetworksession.html#open)( )[stop](qnetworksession.html#stop)()和[isOpen](qnetworksession.html#isOpen)( ) 。 ``` QNetworkConfiguration QNetworkSession.configuration (self) ``` [](qnetworkconfiguration.html) [返回](qnetworkconfiguration.html)[QNetworkConfiguration](qnetworkconfiguration.html)該網絡會話對象基礎上的。 **See also** [QNetworkConfiguration](qnetworkconfiguration.html)。 ``` QNetworkSession.connectNotify (self, SIGNAL()?signal) ``` ``` QNetworkSession.disconnectNotify (self, SIGNAL()?signal) ``` ``` SessionError QNetworkSession.error (self) ``` [ 返回上次發生錯誤的類型。 ](qnetworksession.html#SessionError-enum) [**See also**](qnetworksession.html#SessionError-enum) [state](qnetworksession.html#state)()和[errorString](qnetworksession.html#errorString)( ) 。 ``` QString QNetworkSession.errorString (self) ``` 返回上次發生設備錯誤的人類可讀的描述。 **See also** [error](qnetworksession.html#error)( ) 。 ``` QNetworkSession.ignore (self) ``` 這種方法也是一個Qt槽與C + +的簽名`void ignore()`。 該函數表示該應用程序不希望漫游會話。 **See also** [migrate](qnetworksession.html#migrate)( ) 。 ``` QNetworkInterface QNetworkSession.interface (self) ``` [ 返回用于此會話的網絡接口。 ](qnetworkinterface.html) [這個函數只返回一個有效的](qnetworkinterface.html)[QNetworkInterface](qnetworkinterface.html)在本次會議是[Connected](qnetworksession.html#State-enum)。 返回的接口可能會改變一個漫游過程的結果。 注:此功能在Symbian的模擬器,由于連接是模擬Windows上的工作方式。 **See also** [state](qnetworksession.html#state)( ) 。 ``` bool QNetworkSession.isOpen (self) ``` 返回True如果這個環節是開放的。如果所有打開的會話數是大于零的底層網絡接口將保持連接/向上。 會話可以通過被控制[open](qnetworksession.html#open)()和[close](qnetworksession.html#close)( ) 。 ``` QNetworkSession.migrate (self) ``` 這種方法也是一個Qt槽與C + +的簽名`void migrate()`。 指示會話漫游到新的接入點。舊的接入點保持有效,直到應用程序調用[accept](qnetworksession.html#accept)( ) 。 該[newConfigurationActivated](qnetworksession.html#newConfigurationActivated)()信號被發射一次漫游已經完成。 **See also** [accept](qnetworksession.html#accept)( ) 。 ``` QNetworkSession.open (self) ``` 這種方法也是一個Qt槽與C + +的簽名`void open()`。 創建一個公開會議這增加了底層網絡接口上的會話計數。直到會話引用計數器達到零,系統將不會終止網絡接口。因此,一個公開會議允許應用程序注冊其使用的接口。 由于調用open的結果( )接口將被啟動,如果它沒有連接/上呢。有些平臺可能不提供了進程外會話的支持。在這種平臺上的會話計數器會忽略另一個進程持有的任何會議。該平臺的能力可通過被檢測[QNetworkConfigurationManager.capabilities](qnetworkconfigurationmanager.html#capabilities)( ) 。 注意,這個調用是異步的。根據此調用的結果的結果可以通過連接到被詢問[stateChanged](qnetworksession.html#stateChanged)( )[opened](qnetworksession.html#opened)()或[error](qnetworksession.html#error)( )信號。 這不是一個要求,以便監測底層網絡接口打開會話。 **See also** [close](qnetworksession.html#close)( )[stop](qnetworksession.html#stop)()和[isOpen](qnetworksession.html#isOpen)( ) 。 ``` QNetworkSession.reject (self) ``` 這種方法也是一個Qt槽與C + +的簽名`void reject()`。 新的接入點是不適合的應用。通過調用這個函數會返回先前的接入點/配置。這個動作可能會使已經通過不想要的接入點建立的任何插座。 **See also** [accept](qnetworksession.html#accept)( ) 。 ``` QVariant QNetworkSession.sessionProperty (self, QString?key) ``` 返回屬性的值_key_。 一個網絡會話可以有附加這可能說明會話更詳細的屬性。這個函數可用于獲得這些屬性。 下面的屬性鍵,保證在所有平臺上指定: | Key | Description | | --- | --- | | ActiveConfiguration | If the session [isOpen](qnetworksession.html#isOpen)() this property returns the identifier of the [QNetworkConfiguration](qnetworkconfiguration.html) that is used by this session; otherwise an empty string.該鍵的主要目的是確定哪些互聯網接入點使用,如果會話是基于[ServiceNetwork](qnetworkconfiguration.html#Type-enum)。下面的代碼片段凸顯差異: ``` [QNetworkConfigurationManager](qnetworkconfigurationmanager.html) mgr; [QNetworkConfiguration](qnetworkconfiguration.html) ap = mgr.defaultConfiguration(); [QNetworkSession](qnetworksession.html) *session = new [QNetworkSession](qnetworksession.html)(ap); ... //code activates session [QString](qstring.html) ident = session-&gt;sessionProperty("ActiveConfiguration").toString(); if ( ap.type() == [QNetworkConfiguration](qnetworkconfiguration.html).ServiceNetwork ) { Q_ASSERT( ap.identifier() != ident ); Q_ASSERT( ap.children().contains( mgr.configurationFromIdentifier(ident) ) ); } else if ( ap.type() == [QNetworkConfiguration](qnetworkconfiguration.html).InternetAccessPoint ) { Q_ASSERT( ap.identifier() == ident ); } ``` | | UserChoiceConfiguration | If the session [isOpen](qnetworksession.html#isOpen)() and is bound to a [QNetworkConfiguration](qnetworkconfiguration.html) of type UserChoice, this property returns the identifier of the [QNetworkConfiguration](qnetworkconfiguration.html) that the configuration resolved to when [open](qnetworksession.html#open)() was called; otherwise an empty string.這個密鑰的目的是為了確定實際[QNetworkConfiguration](qnetworkconfiguration.html)該會話使用。這關鍵是要從不同_ActiveConfiguration_在這關鍵的可能會返回一個標識符為任何一個[service network](qnetworkconfiguration.html#Type-enum)或[Internet access points](qnetworkconfiguration.html#Type-enum)配置,而_ActiveConfiguration_總是返回標識符[Internet access points](qnetworkconfiguration.html#Type-enum)配置。 | | ConnectInBackground | Setting this property to _true_ before calling [open](qnetworksession.html#open)() implies that the connection attempt is made but if no connection can be established, the user is not connsulted and asked to select a suitable connection. This property is not set by default and support for it depends on the platform. | | AutoCloseSessionTimeout | If the session requires polling to keep its state up to date, this property holds the timeout in milliseconds before the session will automatically close. If the value of this property is -1 the session will not automatically close. This property is set to -1 by default.此屬性的目的是盡量減少在使用輪詢來更新會話的狀態平臺的資源使用。應用程序可以將此屬性的值設置為所需的超時之前關閉會話。響應于該[closed](qnetworksession.html#closed)( )信號的網絡會話應刪除,以確保所有投票已停止。一旦它再次需要該會話就可以被重建。此屬性對會話不需要輪詢沒有影響。 | **See also** [setSessionProperty](qnetworksession.html#setSessionProperty)( ) 。 ``` QNetworkSession.setSessionProperty (self, QString?key, QVariant?value) ``` 設置屬性_value_本屆會議。該物業使用標識_key_。移除已設置的屬性可以通過傳遞一個無效的實現[QVariant](qvariant.html)。 注意,這個_UserChoiceConfiguration_和_ActiveConfiguration_屬性是只讀的,不能用這種方法來改變。 **See also** [sessionProperty](qnetworksession.html#sessionProperty)( ) 。 ``` State QNetworkSession.state (self) ``` [ 返回會話的狀態。 如果會話是基于一個單一的訪問點配置會話的狀態是一樣的相關網絡接口的狀態。因此,一個網絡會話對象可以用來監視網絡接口。 ](qnetworksession.html#State-enum) [A](qnetworksession.html#State-enum) [QNetworkConfiguration.ServiceNetwork](qnetworkconfiguration.html#Type-enum)根據會議總結了所有兒童的狀態,因此返回[Connected](qnetworksession.html#State-enum)如果狀態的服務網絡的至少一個[children()](qnetworkconfiguration.html#children)配置處于活動狀態。 請注意,它不是必需的,以便獲得網絡接口的狀態舉行公開會議。一個連接,但閉門會議可以用來監視網絡接口,而一個開放和連接的會話對象可能會阻止網絡接口被關閉。 **See also** [error](qnetworksession.html#error)()和[stateChanged](qnetworksession.html#stateChanged)( ) 。 ``` QNetworkSession.stop (self) ``` 這種方法也是一個Qt槽與C + +的簽名`void stop()`。 對失效的網絡接口的所有打開的會話,因此停止了底層網絡接口。此函數始終改變會話的[state](qnetworksession.html#state)( )標志,以[Disconnected](qnetworksession.html#State-enum)。 在Symbian平臺,一個' NetworkControl的能力是必需的全接口級站(不帶能力,僅在當前會話已停止) 。 **See also** [open](qnetworksession.html#open)()和[close](qnetworksession.html#close)( ) 。 ``` bool QNetworkSession.waitForOpened (self, int?msecs?=?30000) ``` 等待,直到會話已開盤,最高_msecs_毫秒。如果會話已經打開,則該函數返回True,否則返回False 。當它返回False的情況下,你可以調用[error](qnetworksession.html#error)()來確定錯誤的原因。 下面的例子最多等待一秒要打開的會話: ``` session->open(); if (session->waitForOpened(1000)) qDebug("Open!"); ``` If _msecs_為-1 ,此功能將不會超時。 **See also** [open](qnetworksession.html#open)()和[error](qnetworksession.html#error)( ) 。 * * * ## Qt Signal Documentation ``` void closed () ``` 這是該信號的默認超載。 當網絡會話已被關閉,這個信號被發射。 ``` void error (QNetworkSession::SessionError) ``` 這是該信號的默認超載。 這個信號被發射時發生錯誤之后。該_error_參數描述發生的錯誤。 **See also** [error](qnetworksession.html#error)()和[errorString](qnetworksession.html#errorString)( ) 。 ``` void newConfigurationActivated () ``` 這是該信號的默認超載。 這個信號被發射一次會話已漫游到新的接入點。應用程序可能會重新開放插座和測試新的網絡鏈接適用性。隨后,它必須要么[accept](qnetworksession.html#accept)()或[reject](qnetworksession.html#reject)( )新的接入點。 **See also** [accept](qnetworksession.html#accept)()和[reject](qnetworksession.html#reject)( ) 。 ``` void opened () ``` 這是該信號的默認超載。 網絡會話已被打開時,這個信號被發射。 底層網絡接口不會被只要會話保持打開關閉。請注意,此功能是依賴于[system wide session support](qnetworkconfigurationmanager.html#Capability-enum)。 ``` void preferredConfigurationChanged (const QNetworkConfiguration&,bool) ``` 這是該信號的默認超載。 這個信號被發射時的會話更改首選配置/接入點。只有那些基于服務的網絡配置會話可能會發出這樣的信號。_config_可用于確定接入點的具體細節,如代理設置,并_isSeamless_指示漫游是否將打破會話的IP地址。 其結果是,以該信號中的應用程序必須通過調用啟動漫游過程[migrate](qnetworksession.html#migrate)( )或選擇[ignore](qnetworksession.html#ignore)( )新的接入點。 如果在漫游過程是非無縫的IP地址將改變表示一個插座變得無效。然而無縫移動可以確保本地IP地址不會改變。這是通過使用這勢必會在實際鏈路地址的虛擬IP地址來實現。在漫游過程中,虛擬地址被附加到新的鏈路地址。 有些平臺可能支持強制漫游和應用層漫游( ALR )的概念。強制漫游意味著該平臺可以簡單地漫游到一個新的配置沒有諮詢應用。它是由應用程序來檢測鏈路層的損失和重建它的插座。相比之下ALR提供的機會,以防止系統的漫游。如果這個會話是基于一個支持漫游的應用程序可以選擇是否要通過連接到這個信號進行諮詢( ALR用例)的配置。只要這個信號連接保持該會話仍然注冊為漫游的利益相關者,否則漫游將通過該平臺實施。 **See also** [migrate](qnetworksession.html#migrate)( )[ignore](qnetworksession.html#ignore)()和[QNetworkConfiguration.isRoamingAvailable](qnetworkconfiguration.html#isRoamingAvailable)( ) 。 ``` void stateChanged (QNetworkSession::State) ``` 這是該信號的默認超載。 這個信號被發射時的網絡會話的狀態改變。該_state_參數是新的狀態。 **See also** [state](qnetworksession.html#state)( ) 。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看