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
- Наследование
- Атрибуты
- Реализации
Требования к 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 . |
Применяется к
См. также раздел
- ControlChannelTrigger
- IClosable
- GetProxyConfigurationAsync(Uri)
- CanConnectDirectly
- PeerFinder
- SocketError
- SocketErrorStatus
- StreamSocketControl
- DatagramSocketInformation
- StreamSocketListener
- ConnectAsync(Uri)
- WiFiDirectDevice
- Windows.Devices.Bluetooth.Rfcomm
- Windows.Devices.WiFiDirect
- Windows.Networking.Proximity
- Подключение с помощью сокетов (XAML)
- Обработка исключений в сетевых приложениях
- Подключение с помощью сокета потока (HTML)
- Подключение с помощью сокета потока (XAML)
- Защита подключений сокетов с помощью TLS/SSL (HTML)
- Защита подключений сокетов с помощью TLS/SSL (XAML)
- Настройка параметров фонового подключения
- Определение возможностей устройств для Bluetooth
- Использование расширенных элементов управления сокетами (XAML)
- Поддержка близкого взаимодействия и касания
- Устранение неполадок и отладка сетевых подключений
- SetSocketMediaStreamingMode
- Пример чата Bluetooth Rfcomm
- Пример StreamSocket ControlChannelTrigger
- Образец Proximity
- Пример StreamSocket (Windows 10)
- Пример DatagramSocket (Windows 10)
- Пример потока сокета триггера действия сокета