StreamSocket Clase

Definición

Admite la comunicación de red mediante un socket de flujo a través de TCP o Bluetooth RFCOMM en aplicaciones para 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
Herencia
Object Platform::Object IInspectable StreamSocket
Atributos
Implementaciones

Requisitos de Windows

Familia de dispositivos
Windows 10 (se introdujo en la versión 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (se introdujo en la versión v1.0)
Características de aplicaciones
bluetooth.rfcomm ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

Ejemplos

Las aplicaciones de ejemplo que usan esta clase incluyen el ejemplo de chat RFCOMM de Bluetooth, el ejemplo datagramSocket (Windows 10), el ejemplo de socket del desencadenador de actividad de socket, el ejemplo streamSocket (Windows 10) y Wi-Fi Direct ejemplo.

Comentarios

La clase StreamSocket admite comunicaciones de red que usan un socket de flujo a través de TCP o Bluetooth RFCOMM en aplicaciones para UWP.

En el caso de una aplicación cliente, la secuencia de operaciones más común mediante StreamSocket son las siguientes:

  • Cree streamSocket.
  • Obtenga un objeto StreamSocketControl mediante la propiedad Control y establezca las propiedades en el objeto StreamSocketControl antes de llamar a uno de los métodos ConnectAsync .
  • Llame a uno de los métodos ConnectAsync para establecer una conexión con el punto de conexión remoto. Para Bluetooth, el nombre del servicio remoto es un identificador de servicio Bluetooth. Si se requiere inmediatamente una conexión SSL/TLS para TCP o un nivel de cifrado para Bluetooth, se puede especificar mediante algunos de los métodos ConnectAsync . Si se desea una conexión SSL/TLS después de enviar y recibir algunos datos iniciales para un socket TCP, se puede llamar al método UpgradeToSslAsync más adelante para actualizar la conexión para usar SSL.
  • Obtenga la propiedad OutputStream para escribir datos en el host remoto.
  • Obtenga la propiedad InputStream para leer datos del host remoto.
  • Leer y escribir datos según sea necesario.
  • Llame al método Close para desconectar el socket, anular las operaciones pendientes y liberar todos los recursos no administrados asociados al objeto StreamSocket.

Nota

Las aplicaciones para UWP escritas en JavaScript usan el método Close . En el caso de las aplicaciones escritas con .NET Framework 4.5 en C# y VB.NET, el método Close se expone como método en StreamSocket. En el caso de las aplicaciones escritas en C++, se llamará al método Close al usar la palabra clave delete en el objeto .

Cerrar explícitamente un objeto StreamSocket (llamando al método Close ) garantizará una desconexión correcta si no existen operaciones de lectura o escritura pendientes en el socket. Todas las lecturas pendientes se anulan automáticamente y StreamSocket espera a que se complete cualquier E/S en curso antes de anular la conexión. Si no hay datos no leídos en el socket una vez finalizada la E/S en curso, se garantiza una desconexión correcta (FIN). De lo contrario, se produce una desconexión incorrecta (RST).

Cuando un objeto StreamSocket activo (aún conectado) sale del ámbito, una desconexión abortiva (no correcta) puede dar lugar a que el par remoto descarte los datos enviados previamente. Se recomienda encarecidamente que se llame a Close (el método Close en JavaScript, el método en C# y VB.NET, o el operador delete de C++) en un objeto StreamSocket antes de salir del ámbito.

Cada vez que se cancela una operación de lectura o escritura, la operación de E/S se completa con el estado Error y el objeto StreamSocket asociado anula inmediatamente la conexión, lo que conduce a una desconexión poco correcta (RST) si los datos no leídos o sin enviar permanecen en el socket.

Las desconexiones incorrectas (RST) siempre se producirán si: se produce una terminación anómala (por ejemplo, se bloquea la aplicación); o la pila de redes detecta un error de conexión anómalo (por ejemplo, tiempo de espera de retransmisión tcp).

El objeto StreamSocket también se usa junto con el objeto StreamSocketListener para escuchar las conexiones entrantes a través de TCP o Bluetooth RFCOMM en aplicaciones de servidor o aplicaciones punto a punto. La propiedad Socket devuelve un objeto StreamSocket en el evento ConnectionReceived cuando un objeto StreamSocketListener recibe una solicitud de conexión RFCOMM TCP o Bluetooth. Para más información, consulte StreamSocketListener.

Compatibilidad con servidores proxy

En una aplicación para UWP, la clase StreamSocket admite la conexión a un punto de conexión remoto cuando se necesitan servidores proxy para completar la conexión. Esta compatibilidad con servidores proxy es automática y transparente para la aplicación. Un StreamSocket puede establecer una conexión mediante la autenticación de servidores proxy, así como a través de otros servidores proxy en los que no se necesita autenticación. La autenticación de servidores proxy solo funciona si Internet Explorer o una aplicación que usa la clase HttpClient en el espacio de nombres Windows.Web.Http se ha autenticado previamente correctamente con el proxy y las credenciales usadas anteriormente para la autenticación siguen siendo válidas. La compatibilidad con la autenticación de servidores proxy no funciona si se usó un explorador web distinto de Internet Explorer para proporcionar las credenciales de autenticación al proxy. No se admite la conexión a través de servidores proxy si se especifica una dirección de host local o un adaptador de red específico en el método ConnectAsync .

En una aplicación para UWP, los métodos ConnectAsync del objeto StreamSocket intentan detectar servidores proxy y la configuración del proxy actual antes y después de la resolución de nombres para ayudar a acelerar el establecimiento de la conexión. Si se especifica un puerto para el punto de conexión en lugar de un nombre de servicio, tanto la detección de proxy como la resolución de nombres se inician internamente. Si la detección de proxy se completa antes de la resolución de nombres y la propiedad CanConnect Indirect en el objeto ProxyConfiguration es false, se intentará una conexión de proxy. Una vez completada la resolución de nombres, la detección de proxy se inicia de nuevo con la dirección del punto de conexión resuelto para determinar la configuración del proxy actual. Si CanConnect Indirect indica después de la resolución de nombres que la aplicación puede conectarse directamente al punto de conexión remoto, se intentará una conexión de socket directamente al punto de conexión. Si CanConnect Indirect es false después de la resolución de nombres, se intentará una conexión de socket directamente al punto de conexión y se intentará una conexión de socket paralelo a través del proxy. StreamSocket usa la primera conexión para que se realice correctamente y se cancela la otra conexión.

Puede haber casos en los que CanConnect Indirect devuelve false, pero no significa que no pueda acceder al recurso directamente. Se podría configurar una red local para tener compatibilidad con una traducción de direcciones de red y proxy (NAT). El script WPAD usado para proporcionar información de proxy a un explorador web o HttpClient indica a Windows que debe usar el proxy. Esto puede causar problemas cuando el punto de conexión remoto no espera una conexión de proxy (por ejemplo, una solicitud HTTP CONNECT). Una aplicación puede usar el método GetProxyConfigurationAsync en el objeto NetworkInformation pasando el punto de conexión remoto y el puerto para el parámetro URI para recuperar información de proxy para ayudar a determinar cuándo se sospecha esta condición. Una manera de evitar que las solicitudes de conexión de proxy se envíen cuando un servidor solo puede controlar las conexiones directas es usar el método ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter), ya que la lógica relacionada con proxy está deshabilitada cuando se selecciona un adaptador de red específico.

En una aplicación Windows Phone 8.x, StreamSocket no proporciona compatibilidad automática con servidores proxy, ya que la clase ProxyConfiguration no se admite en Windows Phone.

Control de excepciones

Debe escribir código para controlar excepciones al llamar a métodos asincrónicos en la clase StreamSocket. Las excepciones pueden deberse a errores de validación de parámetros, errores de resolución de nombres y errores de red. Las excepciones de los errores de red (pérdida de conectividad, errores de conexión y errores de servidor, por ejemplo) pueden producirse en cualquier momento. Estos errores hacen que se arrojen excepciones. Si la aplicación no la controla, una excepción puede hacer que el tiempo de ejecución finalice toda la aplicación.

El espacio de nombres Windows.Networking.Sockets tiene características que simplifican el control de errores al usar sockets. El método GetStatus de la clase SocketError puede convertir hrESULT de una excepción a un valor de enumeración SocketErrorStatus . Esto puede ser útil para controlar de un modo diferente excepciones de red específicas en la aplicación. Una aplicación también puede usar HRESULT de la excepción en los errores de validación de parámetros para obtener información más detallada sobre el error que provocó la excepción.

Para obtener más información sobre las posibles excepciones y cómo controlar las excepciones, consulte Control de excepciones en aplicaciones de red.

Uso de StreamSocket con proximidad, Wi-Fi Direct y Bluetooth

La aplicación puede usar streamSocket para las conexiones de red entre dispositivos que están dentro del intervalo cercano. Las clases del espacio de nombres Windows.Networking.Proximity admiten conexiones de red con streamSocket a dispositivos cercanos que usan Bluetooth o Wi-Fi Direct. PeerFinder y las clases relacionadas del espacio de nombres Windows.Networking.Proximity permiten a la aplicación detectar otra instancia de la aplicación en un dispositivo cercano. El método PeerFinder.FindAllPeersAsync busca equipos del mismo nivel que ejecutan la misma aplicación dentro del intervalo inalámbrico. El método PeerFinder.ConnectAsync devuelve un StreamSocket conectado que la aplicación puede usar para transferir datos de red con la aplicación del mismo nivel cercana. Para obtener más información, consulte Compatibilidad con proximidad y pulsación, Windows.Networking.Proximity, PeerFinder y el ejemplo de proximidad.

La aplicación también puede usar streamSocket para las conexiones de red entre dispositivos que usan Wi-Fi Direct con clases en el espacio de nombres Windows.Devices.WiFiDirect . La clase WiFiDirectDevice se puede usar para localizar otros dispositivos que tienen un dispositivo compatible con Wi-Fi Direct (WFD). El método WiFiDirectDevice.GetDeviceSelector obtiene el identificador de dispositivo de un dispositivo WFD cercano. Una vez que tenga una referencia a un dispositivo WFD cercano, puede llamar al método WiFiDirectDevice.GetConnectionEndpointPairs para obtener un objeto EndpointPair . El método ConnectAsync(EndpointPair) o ConnectAsync(EndpointPair, SocketProtectionLevel) de la clase StreamSocket se puede usar para establecer una conexión de socket. Para obtener más información, consulta Windows.Devices.WiFiDirect y WiFiDirectDevice.

Bluetooth usa identificadores de servicio Bluetooth como puntos de conexión para conexiones StreamSocket, no nombres de host ni direcciones IP. Para usar streamSocket con Bluetooth, la funcionalidad del dispositivo bluetooth.rfcomm debe establecerse en el manifiesto de la aplicación. Para obtener más información, consulta el espacio de nombres Windows.Devices.Bluetooth.Rfcomm , Cómo especificar las funcionalidades del dispositivo para Bluetooth y el ejemplo de Chat de Rfcomm de Bluetooth.

Uso de StreamSocket en Windows Server 2012

En Windows Server 2012 y Windows Server 2012 R2, el Windows.Networking.dll que implementa la mayoría de las clases del espacio de nombres Windows.Networking.Sockets no se cargará a menos que la característica media Foundation esté habilitada. Como resultado, las aplicaciones que usan StreamSocket y las clases de socket relacionadas en el espacio de nombres Windows.Networking.Sockets producirán un error si la característica media Foundation está deshabilitada. Windows Server 2012 o Windows Server 2012 R2 se instala con la característica Media Foundation deshabilitada.

La característica de Media Foundation se puede habilitar en Windows Server 2012 o Windows Server 2012 R2 mediante Administrador del servidor o escribiendo el texto siguiente en un símbolo del sistema o en un script:

dism /online /enable-feature /featurename:ServerMediaFoundation Una vez habilitada la característica media Foundation, se le pedirá al usuario que se reinicie. Una vez reiniciado el equipo, las clases para sockets y WebSockets en el espacio de nombres Windows.Networking.Sockets funcionarán según lo previsto.

Resolución de registros del servicio DNS mediante StreamSocket

Una aplicación puede comunicarse con la dirección DNS de destino que pertenece a un registro SRV. Por ejemplo, un servicio Extensible Messaging and Presence Protocol (XMPP) en el dominio Contoso corresponde a _xmpp-client._tcp.contoso.com. Ese nombre de servicio corresponde a un nombre DNS del servidor, por ejemplo, xmpp-client01.contoso.com.

Para conectarse a la dirección DNS del servidor para ese servicio, use la siguiente llamada de método en una instancia de StreamSocket:

using Windows.Networking.Sockets;

StreamSocket socket = new StreamSocket();
socket.ConnectAsync(new HostName("contoso.com"), "xmpp-client");

El protocolo se deduce como TCP para las instancias de StreamSocket. El método trata los caracteres de subrayado.

Se puede configurar un DNS para que tenga una jerarquía SRV. Los registros de recursos SRV de DNS podrían tener la siguiente forma: _xmpp-client._service01._tcp.contoso.com. En este ejemplo, use la siguiente llamada de método en una instancia de StreamSocket:

socket.ConnectAsync(new HostName("contoso.com"), "xmpp-client._service01");

Estos fragmentos de código usan ConnectAsync. El método GetEndpointPairsAsync admite un uso similar para conectarse a los servicios.

Historial de versiones

Versión de Windows Versión del SDK Valor agregado
1607 14393 GetEndpointPairsAsync(HostName,String)
1607 14393 GetEndpointPairsAsync(HostName,String,HostNameSortOptions)

Constructores

StreamSocket()

Crea un nuevo objeto StreamSocket .

Propiedades

Control

Obtiene los datos de control de socket en un objeto StreamSocket .

Information

Obtiene información de socket en un objeto StreamSocket .

InputStream

Obtiene el flujo de entrada que se va a leer desde el destino remoto en un objeto StreamSocket .

OutputStream

Obtiene el flujo de salida que se va a escribir en el host remoto en un objeto StreamSocket .

Métodos

CancelIOAsync()

Cancela las lecturas y escrituras pendientes en un objeto StreamSocket .

Close()

Cierra el objeto StreamSocket .

ConnectAsync(EndpointPair)

Inicia una operación asincrónica en un objeto StreamSocket para conectarse a un destino de red remoto especificado como un objeto EndpointPair .

ConnectAsync(EndpointPair, SocketProtectionLevel)

Inicia una operación asincrónica en un objeto StreamSocket para conectarse a un destino de red remoto especificado como un objeto EndpointPair y una enumeración SocketProtectionLevel . Este método no se puede llamar desde JavaScript.

ConnectAsync(HostName, String)

Inicia una operación asincrónica en un objeto StreamSocket para conectarse a un destino de red remoto especificado por un nombre de host remoto y un nombre de servicio remoto.

ConnectAsync(HostName, String, SocketProtectionLevel)

Inicia una operación asincrónica en un objeto StreamSocket para conectarse a un destino remoto especificado por un nombre de host remoto, un nombre de servicio remoto y un socketProtectionLevel.

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

Inicia una operación asincrónica en un objeto StreamSocket en un adaptador de red local especificado para conectarse a un destino remoto especificado por un nombre de host remoto, un nombre de servicio remoto y un socketProtectionLevel.

Dispose()

Realiza tareas definidas por la aplicación asociadas a la liberación o al restablecimiento de recursos no administrados.

EnableTransferOwnership(Guid)

Permite que el agente de sockets desencadene la tarea en segundo plano de la aplicación cuando llega el tráfico de este StreamSocket mientras la aplicación no está activa.

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

Habilita o deshabilita la capacidad de que el agente de sockets desencadene la tarea en segundo plano de la aplicación cuando llega el tráfico para este StreamSocket mientras el sistema está en espera conectado.

GetEndpointPairsAsync(HostName, String)

Obtiene una lista de objetos EndpointPair basados en un nombre de host remoto y un nombre de servicio remoto que se pueden usar para enviar paquetes TCP a un destino de red remota.

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

Obtiene una lista de objetos EndpointPair basados en un nombre de host remoto y un nombre de servicio remoto y el criterio de ordenación que se va a usar.

TransferOwnership(String)

Transfiere la propiedad de StreamSocket al servicio de agente de sockets, que supervisa la actividad del socket y notifica a la aplicación a través de una tarea en segundo plano si hay alguna actividad.

TransferOwnership(String, SocketActivityContext)

Transfiere la propiedad de StreamSocket al servicio de agente de sockets, que supervisa la actividad del socket y notifica a la aplicación a través de una tarea en segundo plano si hay alguna actividad. Especifica un nuevo SocketActivityContext para el socket.

TransferOwnership(String, SocketActivityContext, TimeSpan)

Transfiere la propiedad de StreamSocket al servicio de agente de sockets, que supervisa la actividad del socket y notifica a la aplicación a través de una tarea en segundo plano si hay alguna actividad. Especifica un nuevo SocketActivityContext y un tiempo de mantenimiento activo para el socket.

UpgradeToSslAsync(SocketProtectionLevel, HostName)

Inicia una operación asincrónica para actualizar un socket conectado para usar SSL en un objeto StreamSocket .

Se aplica a

Consulte también