语言

StreamSocket 类

定义

支持在 UWP 应用中通过 TCP 或蓝牙 RFCOMM 使用流套接字进行网络通信。

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 要求

要求 说明
设备系列
Windows 10 (在 10.0.10240.0 中引入)
API contract
Windows.Foundation.UniversalApiContract (在 v1.0 中引入)
应用功能
bluetooth.rfcomm internetClient privateNetworkClientServer

示例

使用此类的示例应用程序包括蓝牙 RFCOMM 聊天示例、DatagramSocket 示例(Windows 10)、套接字活动触发器流套接字示例、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 对象关联的所有非托管资源。

注释

Close 方法由用 JavaScript 编写的 UWP 应用使用。 对于使用 C# 和 VB .NET Framework 4.5 编写的应用.NET,Close 方法公开为 StreamSocket 上的方法。 对于使用 C++ 编写的应用,在对象上使用 delete 关键字时,将调用 Close 方法。

显式关闭 StreamSocket 对象(调用 Close 方法)可确保在套接字上不存在挂起的读取或写入操作时正常断开连接。 所有挂起的读取都会自动中止,StreamSocket 会等待任何正在进行的 I/O 完成,然后再拆毁连接。 如果在完成正在进行的 I/O 后套接字上没有未读数据,则保证发生正常断开连接(FIN)。 否则,将发生不正常断开连接(RST)。

当活动(仍已连接)StreamSocket 对象超出范围时,中止(非正常)断开连接可能会导致以前发送的数据在远程对等方读取数据之前被丢弃。 强烈建议在 StreamSocket 对象超出范围之前在 StreamSocket 对象上调用 Close(JavaScript 中的 Close 方法、C# 和 VB 中的方法.NET或 C++ 中的 delete 运算符)。

每当读取或写入操作被取消时,I/O 操作都会完成并出现错误状态,并且关联的 StreamSocket 对象会立即断开连接,如果套接字上保留任何未读或未发送的数据,这将导致不正常断开连接(RST)。

如果出现异常终止(例如,应用崩溃),将始终发生不正常断开连接(RST):或者网络堆栈检测到异常连接故障(例如 TCP 重新传输超时)。

StreamSocket 对象还与 StreamSocketListener 对象结合使用,以侦听服务器应用或对等应用中通过 TCP 或蓝牙 RFCOMM 进行的传入连接。 当 StreamSocketListener 对象收到 TCP 或蓝牙 RFCOMM 连接请求时,ConnectionReceived 事件的 Socket 属性将返回 StreamSocket 对象。 有关详细信息,请参阅 StreamSocketListener。

对代理的支持

在 UWP 应用中,StreamSocket 类支持在完成连接时连接到远程终结点。 对代理的这种支持对应用是自动且透明的。 StreamSocket 可以通过验证代理以及不需要身份验证的其他代理建立连接。 仅当Internet Explorer或使用 Windows 中的 HttpClient 类的应用时,身份验证代理才起作用。Web.Http 命名空间以前已成功通过代理进行身份验证,以前用于身份验证的凭据仍然有效。 如果除Internet Explorer以外的 Web 浏览器用于向代理提供身份验证凭据,则对身份验证代理的支持不起作用。 如果在 ConnectAsync 方法上指定了本地主机地址或特定网络适配器,则不支持通过代理进行连接。

在 UWP 应用中,StreamSocket 对象上的 ConnectAsync 方法尝试在名称解析前后发现代理和当前代理配置,以帮助加快连接建立速度。 如果为终结点而不是服务名称指定了端口,则代理发现和名称解析都在内部启动。 如果代理发现在名称解析之前完成,ProxyConfiguration 对象上的 CanConnectDirectly 属性为 false,则会尝试代理连接。 名称解析完成后,使用解析的终结点地址再次启动代理发现,以确定当前的代理配置。 如果 CanConnectDirectly 在名称解析后指示应用可以直接连接到远程终结点,则将直接尝试与终结点建立套接字连接。 如果在名称解析后 CanConnectDirectly 为 false ,则将直接尝试到终结点的套接字连接,并通过代理尝试并行套接字连接。 要成功的第一个连接由 StreamSocket 使用,另一个连接被取消。

在某些情况下 ,CanConnectDirectly 返回 false,但这并不意味着无法直接访问资源。 可以将本地网络配置为同时支持代理和网络地址转换(NAT)。 用于向 Web 浏览器或 HttpClient 提供代理信息的 WPAD 脚本告知Windows它应使用代理。 这可能会导致远程终结点不需要代理连接(例如 HTTP CONNECT 请求)时出现问题。 应用可以使用 NetworkInformation 对象上的 GetProxyConfigurationAsync 方法传递 uri 参数的远程终结点和端口,以检索代理信息,以帮助确定何时怀疑此条件。 当服务器只能处理直接连接时,避免发送代理连接请求的一种方法是使用 ConnectAsync(HostName、String、SocketProtectionLevel、NetworkAdapter) 方法,因为选择特定网络适配器时会禁用与代理相关的逻辑。

处理异常

在 StreamSocket 类上调用异步方法时,必须编写代码来处理异常。 异常可能是由参数验证错误、名称解析失败和网络错误导致的。 网络错误(例如连接丢失、连接失败和服务器故障)可能会随时发生异常。 这些错误会导致引发异常。 如果应用未处理,异常可能会导致整个应用被运行时终止。

Windows。Networking.Sockets 命名空间具有简化使用套接字时处理错误的功能。 SocketError 类上的 GetStatus 方法可以将 HRESULT 从异常转换为 SocketErrorStatus 枚举值。 这可用于在应用中以不同的方式处理特定网络异常。 应用还可以使用来自参数验证错误的异常中的 HRESULT 来了解有关导致异常的错误的更多详细信息。

有关可能的异常以及如何处理异常的详细信息,请参阅 在网络应用中处理异常。

将 StreamSocket 与邻近感应、Wi-Fi Direct 和蓝牙配合使用

你的应用可以使用 StreamSocket 在接近范围内的设备之间建立网络连接。 Windows中的类。Networking.Proximity 命名空间支持使用 StreamSocket 与使用蓝牙或 Wi-Fi Direct 的附近设备建立网络连接。 Windows中的 PeerFinder 和相关类。Networking.Proximity 命名空间允许应用在附近的设备上发现应用的另一个实例。 PeerFinder.FindAllPeersAsync 方法可浏览在无线范围内运行同一应用的对等计算机。 PeerFinder.ConnectAsync 方法返回一个连接的 StreamSocket,应用可用于将网络数据与附近的对等应用传输。 有关详细信息,请参阅支持邻近感应和点击,Windows。Networking.Proximity、PeerFinder 和邻近感应示例。

你的应用还可以将 StreamSocket 用于 Wi-Fi Direct 与Windows中的类之间的网络连接。Devices.WiFiDirect 命名空间。 WiFiDirectDevice 类可用于查找具有 Wi-Fi Direct(WFD)功能设备的其他设备。 WiFiDirectDevice.GetDeviceSelector 方法获取附近 WFD 设备的设备标识符。 对附近的 WFD 设备的引用后,可以调用 WiFiDirectDevice.GetConnectionEndpointPairs 方法以获取 EndpointPair 对象。 然后,可以使用 StreamSocket 类上的 ConnectAsync(EndpointPair、SocketProtectionLevel)或 ConnectAsync(EndpointPair、SocketProtectionLevel)方法建立套接字连接。 有关详细信息,请参阅Windows。Devices.WiFiDirect 和 WiFiDirectDevice。

蓝牙使用蓝牙服务 ID 作为 StreamSocket 连接的终结点,而不是主机名或 IP 地址。 若要将 StreamSocket 与蓝牙配合使用,必须在应用清单中设置 bluetooth.rfcomm 设备功能。 有关详细信息,请参阅Windows。Devices.Bluetooth.Rfcomm 命名空间、如何为蓝牙指定设备功能以及蓝牙 Rfcomm Chat 示例。

在 Windows Server 2012 上使用 StreamSocket

在 Windows Server 2012 和 Windows Server 2012 R2 上,实现Windows中大多数类的 Windows.Networking.dll。除非启用了 Media Foundation 功能,否则 Networking.Sockets 命名空间将无法加载。 因此,在Windows中使用 StreamSocket 和相关套接字类的应用。如果禁用媒体基础功能,Networking.Sockets 命名空间将失败。 禁用媒体基础功能Windows Server 2012或Windows Server 2012 R2 安装。

可以使用服务器管理器或在命令提示符或脚本中输入以下文本,在 Windows Server 2012 或 Windows Server 2012 R2 上启用媒体基础功能:

dism /online /enable-feature /featurename:ServerMediaFoundation 启用媒体基础功能后,系统会提示用户重启。 重启计算机后,Windows中套接字和 WebSocket 的类。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)

构造函数

名称 说明
StreamSocket()

创建新的 StreamSocket 对象。

属性

名称 说明
Control

获取 StreamSocket 对象上的套接字控制数据。

Information

获取 StreamSocket 对象的套接字信息。

InputStream

获取要从 StreamSocket 对象上的远程目标的读取的输入流。

OutputStream

获取要写入 StreamSocket 对象上的远程主机的输出流。

方法

名称 说明
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 的流量到达系统处于连接待机状态时,启用或禁用应用后台任务触发的应用后台任务的能力。

EnableTransferOwnership(Guid)

当此 StreamSocket 的流量在应用未处于活动状态时到达时,使应用的后台任务可由套接字代理触发。

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

获取基于远程主机名和远程服务名称和要使用的排序顺序的 EndpointPair 对象列表。

GetEndpointPairsAsync(HostName, String)

获取基于远程主机名和远程服务名称的 EndpointPair 对象列表,该名称可用于将 TCP 数据包发送到远程网络目标。

TransferOwnership(String, SocketActivityContext, TimeSpan)

将 StreamSocket 的所有权转移到套接字代理服务,该服务监视套接字活动,并在有任何活动时通过后台任务通知应用。 指定新的 SocketActivityContext 和套接字的保持活动时间。

TransferOwnership(String, SocketActivityContext)

将 StreamSocket 的所有权转移到套接字代理服务,该服务监视套接字活动,并在有任何活动时通过后台任务通知应用。 指定套接字的新 SocketActivityContext 。

TransferOwnership(String)

将 StreamSocket 的所有权转移到套接字代理服务,该服务监视套接字活动,并在有任何活动时通过后台任务通知应用。

UpgradeToSslAsync(SocketProtectionLevel, HostName)

启动异步操作,升级连接的套接字以在 StreamSocket 对象上使用 SSL。

适用于

另请参阅