Поделиться через


StreamSocket Класс

Определение

Поддерживает сетевой обмен данными с помощью потокового сокета через TCP или Bluetooth 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

Семейство устройств
Windows 10 (появилось в 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (появилось в v1.0)
Возможности приложения
bluetooth.rfcomm ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

Примеры

Примеры приложений, использующих этот класс, включают пример чата Bluetooth RFCOMM, пример DatagramSocket (Windows 10),пример сокета потока триггера сокета, пример StreamSocket (Windows 10) и пример Wi-Fi Direct.

Комментарии

Класс StreamSocket поддерживает сетевые подключения, использующие сокет потоковой передачи через TCP или Bluetooth RFCOMM в приложениях UWP.

Для клиентского приложения наиболее распространенная последовательность операций, использующих StreamSocket:

  • Создайте StreamSocket.
  • Получите объект StreamSocketControl с помощью свойства Control и задайте любые свойства объекта StreamSocketControl перед вызовом одного из методов ConnectAsync .
  • Вызовите один из методов ConnectAsync , чтобы установить подключение к удаленной конечной точке. Для Bluetooth именем удаленной службы является идентификатор службы Bluetooth. Если подключение SSL/TLS для TCP или уровень шифрования для Bluetooth требуется немедленно, это можно указать с помощью некоторых методов ConnectAsync . Если после отправки и получения исходных данных для сокета TCP требуется подключение SSL/TLS, метод UpgradeToSslAsync можно вызвать позже, чтобы обновить подключение до использования SSL.
  • Получите свойство OutputStream для записи данных на удаленный узел.
  • Получите свойство InputStream для чтения данных с удаленного узла.
  • При необходимости считывает и записывает данные.
  • Вызовите метод Close , чтобы отключить сокет, прервать все ожидающие операции и освободить все неуправляемые ресурсы, связанные с объектом StreamSocket.

Примечание

Метод Close используется приложениями UWP, написанными на JavaScript. Для приложений, написанных с помощью платформа .NET Framework 4.5 на C# и VB.NET, метод Close предоставляется в качестве метода в StreamSocket. Для приложений, написанных на C++, метод Close будет вызываться при использовании ключевое слово удаления в объекте .

Явное закрытие объекта StreamSocket (вызов метода Close ) обеспечит корректное отключение, если в сокете не существует ожидающих операций чтения или записи. Все ожидающие операции чтения автоматически прерываются, и StreamSocket ожидает завершения всех текущих операций ввода-вывода, прежде чем разрывать подключение. Если после завершения текущего ввода-вывода в сокете не останется непрочитанных данных, гарантируется корректное отключение (FIN). В противном случае происходит несоотключение (RST).

Когда активный (по-прежнему подключенный) объект StreamSocket выходит из область, может произойти прерывание (не корректное) отключение, что может привести к тому, что ранее отправленные данные будут удалены до их чтения удаленным узлом. Настоятельно рекомендуется вызвать метод Close (метод Close в JavaScript, метод в C# и VB.NET или оператор delete в C++) для объекта StreamSocket, прежде чем он выйдет из область.

При отмене операции чтения или записи операция ввода-вывода завершается с состоянием Ошибки, а связанный объект StreamSocket немедленно разрывает соединение, что приводит к несогласованным отключениям (RST), если в сокете остаются непрочитанные или неотправленные данные.

Ненормальные отключения (RST) всегда будут возникать, если: происходит аномальное завершение (например, происходит сбой приложения); или сетевой стек обнаруживает аномальный сбой подключения (например, время ожидания повторной передачи TCP).

Объект StreamSocket также используется вместе с объектом StreamSocketListener для прослушивания входящих подключений через TCP или Bluetooth RFCOMM в серверных приложениях или одноранговых приложениях. Объект StreamSocket возвращается свойством Socket события ConnectionReceived , когда объект StreamSocketListener получает запрос на подключение TCP или Bluetooth RFCOMM. Дополнительные сведения см. в разделе StreamSocketListener.

Поддержка прокси-серверов

В приложении UWP класс StreamSocket поддерживает подключение к удаленной конечной точке, когда для завершения подключения требуются прокси-серверы. Эта поддержка прокси-серверов является автоматической и прозрачной для приложения. StreamSocket может установить подключение через проверку подлинности прокси-серверов, а также через другие прокси-серверы, где проверка подлинности не требуется. Проверка подлинности прокси-серверов работает только в том случае, если интернет-Обозреватель или приложение, использующее класс HttpClient в пространстве имен Windows.Web.Http, ранее успешно прошли проверку подлинности с помощью прокси-сервера, а учетные данные, ранее использовавшиеся для проверки подлинности, остаются действительными. Поддержка проверки подлинности прокси-серверов не работает, если для предоставления учетных данных проверки подлинности прокси-серверу использовался веб-браузер, отличный от интернет-Обозреватель. Подключение через прокси-серверы не поддерживается, если в методе ConnectAsync указан адрес локального узла или определенный сетевой адаптер.

В приложении UWP методы ConnectAsync в объекте StreamSocket пытаются обнаружить прокси-серверы и текущую конфигурацию прокси-сервера до и после разрешения имен, чтобы ускорить создание подключения. Если для конечной точки указан порт, а не имя службы, обнаружение прокси-сервера и разрешение имен инициируются внутренним образом. Если обнаружение прокси-сервера завершается до разрешения имен и свойство CanConnectDirectly в объекте ProxyConfiguration имеет значение false, будет предпринята попытка подключения к прокси-серверу. После завершения разрешения имен обнаружение прокси-сервера снова инициируется с адресом разрешенной конечной точки, чтобы определить текущую конфигурацию прокси-сервера. Если canConnectDirectly указывает после разрешения имен, что приложение может подключаться напрямую к удаленной конечной точке, будет предпринята попытка подключения сокета непосредственно к конечной точке. Если canConnectDirectly имеет значение false после разрешения имени, то будет предпринята попытка подключения сокета непосредственно к конечной точке, а параллельное подключение к сокету будет выполнено через прокси-сервер. Первое успешное подключение используется StreamSocket, а другое соединение отменяется.

Могут быть случаи, когда CanConnect Косвенно возвращает значение false, но это не означает, что вы не можете получить доступ к ресурсу напрямую. В локальной сети можно настроить поддержку как прокси-сервера, так и преобразования сетевых адресов (NAT). Скрипт WPAD, используемый для предоставления сведений о прокси-сервере в веб-браузер или HttpClient , сообщает Windows, что он должен использовать прокси-сервер. Это может привести к проблемам, если удаленная конечная точка не ожидает прокси-подключения (например, запрос HTTP CONNECT). Приложение может использовать метод GetProxyConfigurationAsync в объекте NetworkInformation , передавая удаленную конечную точку и порт для параметра URI , чтобы получить сведения о прокси-сервере, чтобы определить, когда это условие подозревается. Чтобы избежать отправки запросов на подключение прокси-сервера, когда сервер может обрабатывать только прямые подключения, можно использовать метод ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter), так как логика, связанная с прокси-сервером, отключается при выборе определенного сетевого адаптера.

В приложении Windows Phone 8.x StreamSocket не обеспечивает автоматическую поддержку прокси-серверов, так как класс ProxyConfiguration не поддерживается в Windows Phone.

Обработка исключений

Необходимо написать код для обработки исключений при вызове асинхронных методов в классе StreamSocket. Исключения могут возникать из-за ошибок проверки параметров, ошибок разрешения имен и сетевых ошибок. Исключения из сетевых ошибок (например, потеря подключения, сбои подключения и сбои сервера) могут возникать в любое время. В результате таких ошибок создаются исключения. Если приложение не обрабатывает, то исключение может привести к завершению всего приложения средой выполнения.

Пространство имен Windows.Networking.Sockets имеет функции, упрощающие обработку ошибок при использовании сокетов. Метод GetStatus класса SocketError может преобразовать HRESULT из исключения в значение перечисления SocketErrorStatus . Это удобно, чтобы по-разному обрабатывать в приложении различные сетевые исключения. Приложение также может использовать HRESULT из исключения при ошибках проверки параметров, чтобы получить более подробные сведения об ошибке, вызвавшей исключение.

Дополнительные сведения о возможных исключениях и способах обработки исключений см. в разделе Обработка исключений в сетевых приложениях.

Использование StreamSocket с близкого взаимодействия, Wi-Fi Direct и Bluetooth

Приложение может использовать StreamSocket для сетевых подключений между устройствами, которые находятся в близком диапазоне. Классы в пространстве имен Windows.Networking.Proximity поддерживают сетевые подключения с помощью StreamSocket к близлежащим устройствам, использующему Bluetooth или Wi-Fi Direct. PeerFinder и связанные классы в пространстве имен Windows.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 . Метод ConnectAsync(EndpointPair) или ConnectAsync(EndpointPair, SocketProtectionLevel) в классе StreamSocket можно использовать для установки подключения к сокету. Дополнительные сведения см. в разделах Windows.Devices.WiFiDirect и WiFiDirectDevice.

Bluetooth использует идентификаторы служб Bluetooth в качестве конечных точек для подключений StreamSocket, а не имен узлов или IP-адресов. Чтобы использовать StreamSocket с Bluetooth, в манифесте приложения должна быть задана возможность устройства bluetooth.rfcomm . Дополнительные сведения см . в разделах Пространство имен Windows.Devices.Bluetooth.Rfcomm , Как указать возможности устройства для Bluetooth и Пример чата Bluetooth Rfcomm.

Использование StreamSocket в Windows Server 2012

На Windows Server 2012 и Windows Server 2012 R2 Windows.Networking.dll, реализующий большинство классов в пространстве имен Windows.Networking.Sockets, не будет загружаться, если не включена функция Media Foundation. В результате приложения, использующие StreamSocket и связанные классы сокетов в пространстве имен Windows.Networking.Sockets , завершатся сбоем, если компонент Media Foundation отключен. Windows Server 2012 или Windows Server 2012 R2 с отключенным компонентом Media Foundation.

Функцию Media Foundation можно включить в Windows Server 2012 или Windows Server 2012 R2 с помощью диспетчер сервера или путем ввода следующего текста в командной строке или скрипте:

dism /online /enable-feature /featurename:ServerMediaFoundation После включения функции Media Foundation пользователю будет предложено перезапустить его. После перезагрузки компьютера классы для сокетов и WebSocket в пространстве имен Windows.Networking.Sockets будут работать должным образом.

Разрешение записей службы DNS с помощью StreamSocket

Приложение может взаимодействовать с целевым DNS-адресом, принадлежащим записи SRV. Например, служба XMPP в домене Contoso соответствует _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");

Протокол определяется как TCP для экземпляров StreamSocket. Метод обрабатывает символы подчеркивания.

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)

Запускает асинхронную операцию с объектом StreamSocket для подключения к удаленному сетевому назначению, указанному в качестве объекта EndpointPair .

ConnectAsync(EndpointPair, SocketProtectionLevel)

Запускает асинхронную операцию с объектом StreamSocket для подключения к удаленному сетевому назначению, указанному как объект EndpointPair и перечислению SocketProtectionLevel . Этот метод не вызывается из JavaScript.

ConnectAsync(HostName, String)

Запускает асинхронную операцию с объектом StreamSocket для подключения к удаленному сетевому назначению, указанному именем удаленного узла и именем удаленной службы.

ConnectAsync(HostName, String, SocketProtectionLevel)

Запускает асинхронную операцию с объектом StreamSocket для подключения к удаленному назначению, указанному именем удаленного узла, именем удаленной службы и SocketProtectionLevel.

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

Запускает асинхронную операцию объекта StreamSocket в указанном локальном сетевом адаптере для подключения к удаленному назначению, указанному именем удаленного узла, именем удаленной службы и SocketProtectionLevel.

Dispose()

Выполняет определяемые приложением задачи, связанные с удалением, высвобождением или сбросом неуправляемых ресурсов.

EnableTransferOwnership(Guid)

Позволяет активировать фоновую задачу приложения брокером сокетов при поступлении трафика для этого StreamSocket , когда приложение неактивно.

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

Включает или отключает возможность активации фоновой задачи приложения брокером сокетов при поступлении трафика для этого StreamSocket , когда система находится в режиме ожидания подключения.

GetEndpointPairsAsync(HostName, String)

Возвращает список объектов EndpointPair на основе удаленного имени узла и имени удаленной службы, которые можно использовать для отправки ПАКЕТОВ TCP в удаленное сетевое назначение.

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

Возвращает список объектов EndpointPair на основе имени удаленного узла и имени удаленной службы, а также порядка сортировки, который необходимо использовать.

TransferOwnership(String)

Передает право собственности на StreamSocket службе брокера сокетов, которая отслеживает активность сокетов и уведомляет приложение через фоновую задачу, если есть какие-либо действия.

TransferOwnership(String, SocketActivityContext)

Передает право собственности на StreamSocket службе брокера сокетов, которая отслеживает активность сокетов и уведомляет приложение через фоновую задачу, если есть какие-либо действия. Указывает новый socketActivityContext для сокета.

TransferOwnership(String, SocketActivityContext, TimeSpan)

Передает право собственности на StreamSocket службе брокера сокетов, которая отслеживает активность сокетов и уведомляет приложение через фоновую задачу, если есть какие-либо действия. Указывает новый SocketActivityContext и время поддержания активности для сокета.

UpgradeToSslAsync(SocketProtectionLevel, HostName)

Запускает асинхронную операцию обновления подключенного сокета для использования SSL в объекте StreamSocket .

Применяется к

См. также раздел