如何使用高级套接字控件 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

本主题介绍 在 Windows 应用商店应用中使用 DatagramSocketStreamSocketStreamSocketListener 功能时如何使用高级套接字控件。

你需要了解的内容

技术

先决条件

  • 在本主题中,以下示例都来自 JavaScript。建议对套接字有一个基本的了解。

高级控件概述

DatagramSocketStreamSocketStreamSocketListener 类在使用高级控件时都遵循相同的模型。与上述主类对应的是访问高级控件的相关类:

对所有这三个类来说,使用高级控件的基本模型是相同的。 下面的讨论将使用 StreamSocket 作为示例,但相同的方法也适用于 DatagramSocketStreamSocketListener

在启动连接操作或绑定套接字操作之前,应用必须始终设置 StreamSocketControl 上的属性。因此,最好在创建套接字之后立即设置任何高级选项。不要在套接字已调用任何一个 ConnectAsync 方法之后尝试设置 StreamSocketControl 属性。

数据报套接字控件

DatagramSocket 支持使用 UDP 数据报套接字进行网络通信。 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 上有几个高级选项:

在此示例中,我们将更改控制是否启用或禁用 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 上的高级选项被限制为单个选项:

服务质量会影响接收 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

备注

除了控件数据,还有以下的类似相关类的集合,可以提供对这些主类的其他套接字信息的访问:

访问其他套接字信息的模型遵循访问控件数据的相同设计。下面的讨论中将使用 StreamSocket 作为示例。

套接字信息和套接字控件类之间具有一个显著差异。StreamSocketControl 实例上的属性是可读或可写的(get 或 set)。相反,StreamSocketInformation 上的属性是只读的 (get)。应用可以在创建 StreamSocket 之后随时检索 StreamSocketControlStreamSocketInformation 实例上的属性值。但是,在启动连接操作或绑定套接字操作之前,应用必须始终设置 StreamSocketControl 实例上的属性。

相关主题

其他

使用套接字进行连接

如何使用数据报套接字进行连接

如何使用流套接字进行连接

如何借助 TLS/SSL 确保套接字连接的安全

参考

DatagramSocket

DatagramSocketControl

DatagramSocketInformation

StreamSocket

StreamSocketControl

StreamSocketInformation

StreamSocketListener

StreamSocketListenerControl

StreamSocketListenerInformation

Windows.Networking.Sockets