語言

StreamSocket 類別

定義

支援透過 TCP 或藍牙 RFCOMM 在 UWP 應用程式中使用串流接字進行網路通訊。

public ref class StreamSocket sealed : IClosable
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class StreamSocket final : IClosable
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
class StreamSocket final : IClosable
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class StreamSocket : System.IDisposable
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
public sealed class StreamSocket : System.IDisposable
function StreamSocket()
Public NotInheritable Class StreamSocket
Implements IDisposable
繼承
Object Platform::Object IInspectable StreamSocket
屬性
實作

Windows 需求

規格需求 Description
裝置系列
Windows 10 (已於 10.0.10240.0 引進)
API contract
Windows.Foundation.UniversalApiContract (已於 v1.0 引進)
應用程式功能
bluetooth.rfcomm internetClient privateNetworkClientServer

範例

使用此類別的範例應用包括藍牙 RFCOMM 聊天樣本、DatagramSocket 範例(Windows 10)、Socket 活動觸發串流套接字樣本、StreamSocket 範例(Windows 10)及 Wi-Fi Direct 範例。

備註

StreamSocket 類別支援在 UWP 應用程式中使用 TCP 或藍牙 RFCOMM 的串流套接字的網路通訊。

對於用戶端應用程式,使用 StreamSocket 最常見的操作序列如下:

  • 建立 StreamSocket。
  • 使用 Control 屬性取得 StreamSocketControl 物件,並在呼叫 ConnectAsync 方法前,先設定 StreamSocketControl 物件的所有屬性。
  • 呼叫其中一個 ConnectAsync 方法來建立與遠端端點的連線。 藍牙的遠端服務名稱是藍牙服務ID。 若 TCP 需要 SSL/TLS 連線,或藍牙需一定等級的加密,則可透過 ConnectAsync 方法來指定。 若在傳送並接收 TCP 套接字的初始資料後,仍需 SSL/TLS 連線,則可稍後呼叫 UpgradeToSslAsync 方法以升級連線以使用 SSL。
  • 取得 OutputStream 屬性來寫入資料到遠端主機。
  • 取得 InputStream 屬性來讀取遠端主機的資料。
  • 需要時讀寫資料。
  • 呼叫 Close 方法斷開套接字,中止所有待處理的操作,並釋放所有與 StreamSocket 物件相關的未管理資源。

備註

關閉方法用於以 JavaScript 撰寫的 UWP 應用程式。 對於使用 C# 和 VB.NET 中 .NET Framework 4.5 撰寫的應用程式,Close 方法會被公開為 StreamSocket 上的方法。 對於用 C++ 撰寫的應用程式,當物件使用 delete 關鍵字時,會呼叫 Close 方法。

明確關閉 StreamSocket 物件(呼叫 Close 方法)若套接字上沒有待處理的讀寫操作,則可確保順利斷線。 所有待處理的讀取會自動中止,StreamSocket 會等待任何正在進行的 I/O 完成後才斷開連線。 若在進行中 I/O 完成後,套接字上無剩餘未讀資料,則必然會發生優雅斷線(FIN)。 否則,就會發生不優雅斷開(RST)。

當一個活躍(仍連線)的 StreamSocket 物件超出作用範圍時,可能會發生中止(非優雅)斷線,導致先前傳送的資料在遠端對端讀取前被丟棄。 強烈建議在 StreamSocket 物件出作用域前,先呼叫 Close(JavaScript 中的 Close 方法、C# 和 VB.NET 中的 Close 方法,或 C++ 中的刪除運算子)。

每當讀取或寫入操作被取消時,輸入輸出操作會以錯誤狀態完成,相關的 StreamSocket 物件會立即斷開連線,若套接字上仍有未讀取或未傳送的資料,則會導致不優雅斷線(RST)。

不優雅斷線(RST)總是發生於以下情況:異常終止(例如應用程式當機);或是網路堆疊偵測到異常連線失敗(例如TCP重傳逾時)。

StreamSocket 物件也與 StreamSocketListener 物件搭配使用,以監聽伺服器應用程式或點對點應用程式中透過 TCP 或藍牙 RFCOMM 接收的連線。 當 StreamSocketListener 物件收到 TCP 或藍牙 RFCOMM 連線請求時,Socket 屬性會在 ConnectionReceived 事件中回傳 StreamSocket 物件。 欲了解更多資訊,請參閱 StreamSocketListener。

代理伺服器支援

在 UWP 應用程式中,StreamSocket 類別支援在需要代理完成連線時連接到遠端端點。 這種對代理的支援對應用程式來說是自動且透明的。 StreamSocket 可以透過認證代理建立連線,也可以透過其他不需要認證的代理建立連線。 驗證代理程式只有在 Internet Explorer 或使用 HttpClient 類別的 Windows 應用程式時才有效。Web.Http 命名空間先前已成功與代理伺服器進行驗證,且先前用於驗證的憑證仍然有效。 若使用非 Internet Explorer 的瀏覽器提供代理驗證憑證,則驗證代理的支援將無法運作。 若 ConnectAsync 方法中指定了本地主機位址或特定網路介面卡,則不支援透過代理連接。

在 UWP 應用程式中,StreamSocket 物件上的 ConnectAsync 方法會嘗試在名稱解析前後發現代理及當前代理組態,以加快連線建立。 若端點指定埠口而非服務名稱,代理發現與名稱解析皆由內部啟動。 如果代理發現在名稱解析前完成,且 ProxyConfiguration 物件上的 CanConnectDirect 屬性為 false,則會嘗試代理連線。 名稱解析完成後,會再次啟動代理發現,並使用已解析的端點位址來判斷目前的代理配置。 如果 CanConnectDirect 在名稱解析後表示應用程式可以直接連接到遠端端點,那麼就會嘗試直接連接到該端點。 若 CanConnectDirect 在名稱解析後 為假 ,則會嘗試直接連接端點,並嘗試透過代理進行平行套接字連線。 第一個成功的連線會被 StreamSocket 使用,另一個連線則被取消。

有時 CanConnectDirect 可能會回傳 錯誤,但這並不代表你無法直接存取該資源。 本地網路可配置為同時支援代理與網路位址轉換(NAT)。 用於提供代理資訊給網頁瀏覽器或 HttpClient 的 WPAD 腳本告訴 Windows 應該使用代理伺服器。 當遠端端點不預期代理連線(例如 HTTP CONNECT 請求)時,這可能會造成問題。 應用程式可以在 NetworkInformation 物件上使用 GetProxyConfigurationAsync 方法,傳遞遠端端點與埠,取得 uri 參數,以取得代理資訊,以協助判斷何時懷疑此狀況。 當伺服器只能處理直接連線時,避免傳送代理連線請求的方法是使用 ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter) 方法,因為當選擇特定網路介面卡時,代理相關邏輯會被禁用。

處理例外狀況

當你呼叫 StreamSocket 類別的非同步方法時,必須寫程式碼來處理例外。 例外可能因參數驗證錯誤、名稱解析失敗及網路錯誤而產生。 網路錯誤的例外(例如連線中斷、連線失敗及伺服器故障)隨時可能發生。 這些錯誤會導致拋出例外。 如果應用程式無法處理,例外可能會導致整個應用程式在執行時被終止。

Windows。Networking.Sockets 命名空間具備簡化使用套接字時處理錯誤的功能。 SocketError 類別上的 GetStatus 方法可以將例外的 HRESULT 轉換成 SocketErrorStatus 的列舉值。 這對於在應用程式中處理特定網路例外的方式很有幫助。 應用程式也可以利用例外中對參數驗證錯誤的 HRESULT 來學習導致異常的更詳細資訊。

欲了解更多可能例外及如何處理例外的資訊,請參閱 「網路應用程式中的例外處理」。

使用 StreamSocket 搭配 Proximity、Wi-Fi Direct 和藍牙

你的應用程式可以使用 StreamSocket 來連接近距離內的裝置。 Windows 中的類別。Networking.Proximity 命名空間支援使用 StreamSocket 與鄰近使用 Bluetooth 或 Wi-Fi Direct 的裝置連接網路。 Windows 中的 PeerFinder 及相關類別。Networking.Proximity 命名空間讓你的應用程式能在附近裝置上發現另一個應用程式實例。 PeerFinder.FindAllPeersAsync 方法可瀏覽在無線範圍內運行相同應用程式的對等電腦。 PeerFinder.ConnectAsync 方法會回傳一個已連接的 StreamSocket,讓你的應用程式可以用來與附近的對等應用程式傳輸網路資料。 更多資訊請參閱支援接近與敲擊,Windows。Networking.Proximity、PeerFinder 以及 Proximity 樣本。

你的應用程式也可以用 StreamSocket 來連接使用 Wi-Fi Direct 的裝置間的網路連線,Windows 裡有類別。Devices.WiFiDirect 命名空間。 WiFiDirectDevice 類別可用來定位具備 Wi-Fi Direct(WFD)裝置的其他裝置。 WiFiDirectDevice.GetDeviceSelector 方法會取得附近 WFD 裝置的裝置識別碼。 一旦你有附近 WFD 裝置的參考,就可以呼叫 WiFiDirectDevice.GetConnectionEndpointPairs 方法來取得 EndpointPair 物件。 接著可以使用 StreamSocket 類別上的 ConnectAsync(EndpointPair) 或 ConnectAsync(EndpointPair, SocketProtectionLevel) 方法來建立套接字連線。 欲了解更多資訊,請參閱 Windows。裝置。WiFiDirect 和 WiFiDirectDevice。

藍牙使用藍牙服務 ID 作為 StreamSocket 連線的端點,而非主機名稱或 IP 位址。 若要使用 StreamSocket 搭配藍牙,必須在應用程式清單中設定 bluetooth.rfcomm 裝置功能。 更多資訊請參閱 Windows。Devices.Bluetooth.Rfcomm 命名空間、如何指定藍牙裝置功能,以及藍牙 Rfcomm 聊天範例。

在 Windows Server 2012 上使用 StreamSocket

在 Windows Server 2012 和 Windows Server 2012 R2,這是實作大部分 Windows 類別的 Windows.Networking.dll。Networking.Sockets 命名空間若未啟用 Media Foundation 功能,將無法載入。 因此,使用 StreamSocket 及相關 socket 類別的應用程式在 Windows 中,如果關閉 Media Foundation 功能,Networking.Sockets 命名空間將會失敗。 Windows Server 2012 或 Windows Server 2012 R2 安裝時,關閉了媒體基礎功能。

媒體基礎功能可在 Windows Server 2012 或 Windows Server 2012 R2 上啟用,使用 伺服器管理員,或透過命令提示字元或腳本輸入以下文字:

dism /online /enable-feature /featurename:ServerMediaFoundation 啟用 Media Foundation 功能後,使用者會被提示重新啟動。 電腦重新啟動後,Windows 中會建立 sockets 和 WebSockets 的類別。Networking.sockets 命名空間會如預期運作。

使用 StreamSocket 解析 DNS 服務紀錄

應用程式可以與屬於 SRV 紀錄的目標 DNS 位址通訊。 例如,Contoso 域中的可擴充訊息與在線狀態協定(XMPP)服務對應於 _xmpp-client._tcp.contoso.com。 該服務名稱對應伺服器 DNS 名稱,例如 xmpp-client01.contoso.com。

要連接該服務伺服器的 DNS 位址,請在 StreamSocket 實例上使用以下方法呼叫:

using Windows.Networking.Sockets;

StreamSocket socket = new StreamSocket();
socket.ConnectAsync(new HostName("contoso.com"), "xmpp-client");

該協定被推斷為 StreamSocket 實例的 TCP。 此方法處理底線字元。

DNS 可以設定為具有 SRV 階層結構。 DNS SRV 資源記錄可以呈現以下形式: _xmpp-client._service01._tcp.contoso.com。 在此範例中,請對 StreamSocket 實例使用以下方法呼叫:

socket.ConnectAsync(new HostName("contoso.com"), "xmpp-client._service01");

這些程式碼片段使用 ConnectAsync。 GetEndpointPairsAsync 方法支援類似的連接服務方式。

版本歷程記錄

Windows版本 SDK 版本 附加價值
1607 14393 GetEndpointPairsAsync(HostName,String)
1607 14393 GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

建構函式

名稱 Description
StreamSocket()

建立一個新的 StreamSocket 物件。

屬性

名稱 Description
Control

取得 StreamSocket 物件上的 socket 控制資料。

Information

取得 StreamSocket 物件的 socket 資訊。

InputStream

透過 StreamSocket 物件取得遠端目的地的輸入串流讀取。

OutputStream

取得輸出串流,將 StreamSocket 物件寫入遠端主機。

方法

名稱 Description
CancelIOAsync()

取消對 StreamSocket 物件的待處理讀取與寫入。

Close()

關閉 StreamSocket 物件。

ConnectAsync(EndpointPair, SocketProtectionLevel)

在 StreamSocket 物件上啟動非同步操作,連接以 EndpointPair 物件及 SocketProtectionLevel 列舉指定的遠端網路目的地。 此方法無法從 JavaScript 呼叫。

ConnectAsync(EndpointPair)

在 StreamSocket 物件上啟動非同步操作,連接指定為 EndpointPair 物件的遠端網路目的地。

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

在指定的本地網路介面卡上的 StreamSocket 物件上啟動非同步操作,以連接由遠端主機名稱、遠端服務名稱及 SocketProtectionLevel 指定的遠端目的地。

ConnectAsync(HostName, String, SocketProtectionLevel)

在 StreamSocket 物件上啟動非同步操作,連接由遠端主機名稱、遠端服務名稱及 SocketProtectionLevel 指定的遠端目的地。

ConnectAsync(HostName, String)

在 StreamSocket 物件上啟動非同步操作,連接由遠端主機名稱與遠端服務名稱指定的遠端網路目的地。

Dispose()

執行與釋放、釋放或重設非受控資源相關聯的應用程式定義工作。

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

啟用或停用應用程式背景任務,當系統處於連接待機狀態時,當 StreamSocket 的流量抵達時,應用程式的背景任務被 socket broker 觸發。

EnableTransferOwnership(Guid)

當 StreamSocket 的流量抵達時,應用程式未啟用時,能由套接程式代理觸發你的應用程式背景任務。

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

根據遠端主機名稱、遠端服務名稱及排序順序,取得 EndpointPair 物件清單。

GetEndpointPairsAsync(HostName, String)

根據遠端主機名稱與遠端服務名稱,取得 EndpointPair 物件清單,可用於將 TCP 封包傳送至遠端網路目的地。

TransferOwnership(String, SocketActivityContext, TimeSpan)

將 StreamSocket 的所有權轉移給 socket 經紀服務,該服務監控 socket 活動,並在有活動時透過背景任務通知應用程式。 指定一個新的 SocketActivityContext 以及該 socket 的保持存活時間。

TransferOwnership(String, SocketActivityContext)

將 StreamSocket 的所有權轉移給 socket 經紀服務,該服務監控 socket 活動,並在有活動時透過背景任務通知應用程式。 指定一個新的 SocketActivityContext 來指定該套接字。

TransferOwnership(String)

將 StreamSocket 的所有權轉移給 socket 經紀服務,該服務監控 socket 活動,並在有活動時透過背景任務通知應用程式。

UpgradeToSslAsync(SocketProtectionLevel, HostName)

啟動非同步操作,將連接的 socket 升級為 StreamSocket 物件上的 SSL。

適用於

另請參閱