Как использовать расширенные элементы управления сокета (HTML)
[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]
В этом разделе: использование расширенных элементов управления сокетами при применении DatagramSocket, StreamSocket и StreamSocketListener в приложениях Магазина Windows.
Что необходимо знать
Технологии
-
Устанавливает сетевые подключения с использованием сокетов и протоколов WebSocket.
Необходимые условия
- Следующие примеры этого раздела написаны на JavaScript. Рекомендуется иметь базовое представление о сокетах.
Обзор расширенных элементов управления
Классы DatagramSocket, StreamSocket и StreamSocketListener следуют одной модели использования расширенных элементов управления. Основные классы, соответствующие каждому из названных выше классов, являются связанными классами для доступа к расширенным элементам управления:
- DatagramSocketControl — предоставляет данные элемента управления сокетами для объекта DatagramSocket.
- StreamSocketControl — предоставляет данные элемента управления сокетами для объекта StreamSocket.
- StreamSocketListenerControl — предоставляет данные элемента управления сокетами для объекта StreamSocketListener.
Базовая модель использования расширенных элементов управления одинакова для всех трех классов. В следующем примере применяется StreamSocket, но такой же процесс можно использовать для DatagramSocket или StreamSocketListener.
- Создайте элемент управления StreamSocket.
- Используйте свойство StreamSocket.Control, чтобы получить экземпляр StreamSocketControl, связанный с объектом StreamSocket.
- Чтобы задать дополнительный параметр сокета, получите или установите свойство StreamSocketControl.
Перед выполнением операции подключения или привязки сокета приложение всегда должно устанавливать свойство для StreamSocketControl. Поэтому лучше всего устанавливать расширенные свойства сразу после создания сокета. Не пытайтесь установить свойство StreamSocketControl после того, как сокет вызовет один из методов ConnectAsync.
Элементы управления сокета датаграмм
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.
- StreamSocketControl.OutboundBufferSizeInBytes — контролирует размер буфера отправки (в байтах), который используется при отправке данных для объекта StreamSocket.
- StreamSocketControl.QualityOfService — качество обслуживания объекта StreamSocket.
В этом примере мы изменим свойство StreamSocketControl.NoDelay, которое контролирует включение или отключение алгоритма Нагля.
Алгоритм Нагля повышает эффективность сетей TCP/IP, уменьшая количество пакетов, которые надо отправлять по сети. Он пытается решить проблемы приложения, которое многократно передает данные небольшими блоками. Размер заголовка TCP-пакета для IPv4 без каких-либо других параметров заголовка равен 40 байт (IP — 20 байт, TCP — 20 байт). Поэтому, если программа отправляет пакет размером всего 4 байта, служебные данные оказываются очень большими. Это может происходить при использовании протоколов удаленного доступа (например, Telnet или SSH), где большая часть нажатий клавиш создают только один-два байта данных, которые передаются немедленно. При медленном подключении множество таких пакетов может передаваться по сети одновременно. Алгоритм Нагля объединяет несколько небольших исходящих сообщений и отправляет их вместе. Если отправитель не получает подтверждения отправки пакета, он продолжает буферизацию выходных данных, пока не соберет полный пакет отправляемых данных. Это позволяет отправлять все данные вместе. Влияние использования алгоритма Нагля заключается в увеличении пропускной способности за счет задержки. Хорошо написанное приложение, которое само сохраняет отправляемые данные в буфере, не нуждается в использовании алгоритма Нагля.
По умолчанию при создании объекта StreamSocket для этого параметра устанавливается значение true, которое отключает алгоритм Нагля. Этот параметр сокращает возможные задержки при отправке небольших сообщений. Однако если вы используете StreamSocket в программе, которая отправляет множество небольших пакетов, а задержка не имеет значения, то можно включить алгоритм Нагля, чтобы повысить эффективность.
В следующем примере создается класс 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. Параметр normal задается по умолчанию при создании StreamSocket во время соединения. Параметр 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, чтобы получить экземпляр StreamSocketInformation, связанный с объектом StreamSocket.
- Чтобы получить дополнительные данные о сокете, получите свойство экземпляра StreamSocketInformation.
Классы информации о сокете и управления сокетом имеют одно важное отличие. Свойства экземпляра StreamSocketControl доступны для чтения или записи (методы доступа get и set). А свойства экземпляра StreamSocketInformation предназначены только для чтения (метод доступа get). Приложение может получить значение свойства экземпляра StreamSocketControl или StreamSocketInformation в любое время после создания StreamSocket. Однако перед выполнением операции подключения или привязки сокета приложение всегда должно устанавливать свойство для экземпляра StreamSocketControl.
Связанные разделы
Прочие ссылки
Как подключиться с помощью сокета датаграмм
Как подключиться с помощью сокета потока
Защита соединений сокетов с использованием TLS/SSL
Ссылки