Язык

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 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 . Если подключение SSL/TLS требуется после отправки и получения некоторых исходных данных для сокета TCP, метод UpgradeToSslAsync можно вызвать позже, чтобы обновить подключение для использования SSL.
  • Получите свойство OutputStream для записи данных на удаленный узел.
  • Получите свойство InputStream для чтения данных с удаленного узла.
  • Чтение и запись данных по мере необходимости.
  • Вызовите метод Close , чтобы отключить сокет, отменить все ожидающие операции и освободить все неуправляемые ресурсы, связанные с объектом StreamSocket.

Примечание.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Приложение может использовать StreamSocket для сетевых подключений между устройствами, которые находятся в близком диапазоне. Классы в Windows. Пространство имен Network.Proximity поддерживает сетевые подключения с StreamSocket на близлежащих устройствах, использующих Bluetooth или Wi-Fi Direct. Одноранговые и связанные классы в 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. Пространство имен Device.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 пользователю будет предложено перезапустить. После перезапуска компьютера классы для сокетов и WebSockets в 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, SocketProtectionLevel)

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

ConnectAsync(EndpointPair)

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

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

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

ConnectAsync(HostName, String, SocketProtectionLevel)

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

ConnectAsync(HostName, String)

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

Dispose()

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

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

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

EnableTransferOwnership(Guid)

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

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

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

GetEndpointPairsAsync(HostName, String)

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

TransferOwnership(String, SocketActivityContext, TimeSpan)

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

TransferOwnership(String, SocketActivityContext)

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

TransferOwnership(String)

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

UpgradeToSslAsync(SocketProtectionLevel, HostName)

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

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

См. также