如何使用高级套接字控件 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
本主题介绍 在 Windows 应用商店应用中使用 DatagramSocket、StreamSocket 或 StreamSocketListener 功能时如何使用高级套接字控件。
你需要了解的内容
技术
-
使用套接字和 WebSocket 启用网络通信。
先决条件
- 在本主题中,以下示例都来自 JavaScript。建议对套接字有一个基本的了解。
高级控件概述
DatagramSocket、StreamSocket 和 StreamSocketListener 类在使用高级控件时都遵循相同的模型。与上述主类对应的是访问高级控件的相关类:
- DatagramSocketControl - 提供 DatagramSocket 对象上的套接字控件数据。
- StreamSocketControl - 提供 StreamSocket 对象上的套接字控件数据。
- StreamSocketListenerControl - 提供 StreamSocketListener 对象上的套接字控件数据。
对所有这三个类来说,使用高级控件的基本模型是相同的。 下面的讨论将使用 StreamSocket 作为示例,但相同的方法也适用于 DatagramSocket 或 StreamSocketListener。
- 创建一个 StreamSocket。
- 使用 StreamSocket.Control 属性获取与 StreamSocket 对象相关联的 StreamSocketControl 实例。
- 获取或设置 StreamSocketControl 上的一个属性,以设置高级套接字选项。
在启动连接操作或绑定套接字操作之前,应用必须始终设置 StreamSocketControl 上的属性。因此,最好在创建套接字之后立即设置任何高级选项。不要在套接字已调用任何一个 ConnectAsync 方法之后尝试设置 StreamSocketControl 属性。
数据报套接字控件
DatagramSocket 支持使用 UDP 数据报套接字进行网络通信。 DatagramSocket 上的高级选项被限制为单个选项:
- DatagramSocketControl.QualityOfService - DatagramSocket 对象上的服务质量。
服务质量会影响接收 DatagramSocket 对象上的数据包的线程优先级。服务质量可被设置为 SocketQualityOfService 枚举的两种可能值之一。 在创建 DatagramSocket 时,normal 设置是默认值。 lowLatency 设置可提高接收数据包的线程优先级。该选项通常仅用于对时间非常敏感的音频或类似应用。
如下示例将为对时间敏感的应用创建 DatagramSocket,并将 DatagramSocketControl.QualityOfService 设置为 lowLatency。一旦此操作完成,该应用即可在绑定套接字或连接套接字的 DatagramSocket 上调用其他方法。
var clientSocket = new Windows.Networking.Sockets.DatagramSocket();
// The control object is associated with the socket
// Get the current setting for quality of service
// This isn't needed, but it shows how to get the current setting
var currentSetting = clientSocket.Control.QualityOfService;
// Set quality of service to low latency
clientSocket.Control.QualityOfService = SocketQualityOfService.LowLatency;
// Now use the DatagramSocket to call:
// BindEndpointAsync, BindServiceNameAsync,
// ConnectAsync, GetOutputstreamAsync, or
// JoinMulticastGroup
StreamSocket 套接字控件
StreamSocket 支持使用 TCP 流套接字进行网络通信。 StreamSocket 上有几个高级选项:
- StreamSocketControl.KeepAlive - 指示保持活动数据包是否已发送到 StreamSocket 对象上的远程目标。
- StreamSocketControl.NoDelay - 指示是否在 StreamSocket 对象上使用了 Nagle 算法。
- StreamSocketControl.OutboundBufferSizeInBytes - 控制用于发送 StreamSocket 对象上数据的发送缓冲区的大小(以字节为单位)。
- StreamSocketControl.QualityOfService - StreamSocket 对象上的服务质量。
在此示例中,我们将更改控制是否启用或禁用 Nagle 算法的 StreamSocketControl.NoDelay 属性。
Nagle 算法是一种技术,它可通过减少需要通过网络发送的数据包的数量,来提高 TCP/IP 网络的效率。 该算法尝试解决由反复发出小块数据的应用程序所引起的问题。一个没有其他头选项的 IPv4 TCP 数据包具有 40 个字节的头(IP 和 TCP 各占 20 个字节)。所以如果应用发送仅有 4 个字节的数据包,则该数据包数据的开销是非常大的。 这可能会出现在使用远程访问协议(例如 Telnet 或安全外壳)时,此时大多数按键操作可能只生成一个或两个字节的数据,但会立即传输出去。当使用慢速链接时,这些数据包可能会同时在网络上传输。Nagle 算法的工作原理是将一定数量的小型传出消息组合起来,然后将它们一次发送出去。当发送方未接收到已发出数据包的确认时,发件人保持缓冲输出,直到它具有一个完整数据包的输出价值。这样便可使输出一次发送出去。应用 Nagle 算法的影响是以延迟为代价来增加带宽。一个编写完善的、在内部缓冲发送的应用不需要使用 Nagle 算法。
在创建 StreamSocket 时的默认设置是,该选项被设置为 true 以禁用 Nagle 算法。在发送小型消息时,此设置可减少潜在的延迟。但是,对于一个将要使用 StreamSocket 的应用,如果该应用会发送许多小型数据包,但延迟对它来说不是问题时,则可启用 Nagle 算法以提高效率。
以下示例将会创建一个 StreamSocket 并将 StreamSocketControl.NoDelay 设置为 false。一旦此操作完成,该应用即可在连接套接字的 StreamSocket 上调用其他方法。
var clientSocket = new Windows.Networking.Sockets.StreamSocket();
// The control object is associated with the socket
// Get the current setting for this option
// This isn't needed, but it shows how to get the current setting
var currentSetting = clientSocket.Control.NoDelay;
// Don't disable the nagle algorithm
clientSocket.Control.NoDelay = false;
// Now you can use the StreamSocket to call one of the
// ConnectAsync methods
StreamSocketListener 套接字控件
StreamSocketListener 支持对使用 TCP 流套接字的传入网络连接的侦听。StreamSocketListener 上的高级选项被限制为单个选项:
- StreamSocketListener.QualityOfService - 在 StreamSocket 对象上设置的服务质量,该对象在一个连接被 StreamSocketListener 对象接收时创建。
服务质量会影响接收 StreamSocket 对象上的数据包的线程优先级,该对象在一个连接被 StreamSocketListener 对象接收时创建。服务质量可被设置为 SocketQualityOfService 枚举的两种可能值之一。 当一个连接被接受而创建 StreamSocket 时,normal 设置是默认值。 lowLatency 设置会提高接收已创建的 StreamSocket 上的数据包的线程优先级。该选项通常仅用于对时间非常敏感的音频或类似应用接受连接。
如下示例将为对时间敏感的应用创建 StreamSocketListener,并将 StreamSocketListener.QualityOfService 设置为 lowLatency。一旦此操作完成,该应用即可在 StreamSocketListener 上调用其他方法,开始侦听传入连接请求。
var listenSocket = new Windows.Networking.Sockets.StreamSocketListener();
// The control object is associated with the socket
// Get the current setting for quality of service
// This isn't needed, but it shows how to get the current setting
var currentSetting = listenSocket.Control.QualityOfService;
// Set quality of service to low latency
listenSocket.Control.QualityOfService = SocketQualityOfService.LowLatency;
// Now you can use the StreamSocketListener to
// bind to a service name and begin listening for
// incoming connection requests
备注
除了控件数据,还有以下的类似相关类的集合,可以提供对这些主类的其他套接字信息的访问:
- DatagramSocketInformation - 提供 DatagramSocket 对象上的套接字信息。
- StreamSocketInformation - 提供 StreamSocket 对象上的套接字信息。
- StreamSocketListenerInformation - 提供 StreamSocketListener 对象上的套接字信息。
访问其他套接字信息的模型遵循访问控件数据的相同设计。下面的讨论中将使用 StreamSocket 作为示例。
- 创建一个 StreamSocket。
- 使用 StreamSocket.Information 属性获取与 StreamSocket 对象相关的 StreamSocketInformation 实例。
- 获取 StreamSocketInformation 实例上的属性以检索其他套接字信息。
套接字信息和套接字控件类之间具有一个显著差异。StreamSocketControl 实例上的属性是可读或可写的(get 或 set)。相反,StreamSocketInformation 上的属性是只读的 (get)。应用可以在创建 StreamSocket 之后随时检索 StreamSocketControl 或 StreamSocketInformation 实例上的属性值。但是,在启动连接操作或绑定套接字操作之前,应用必须始终设置 StreamSocketControl 实例上的属性。
相关主题
其他
参考