Lenguaje

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

Requisitos Description
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 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 de socket de desencadenador de actividad de socket, el ejemplo streamSocket (Windows 10) y Wi-Fi ejemplo directo.

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.

Para una aplicación cliente, la secuencia de operaciones más común con StreamSocket son las siguientes:

  • Cree streamSocket.
  • Obtenga un objeto StreamSocketControl mediante la propiedad Control y establezca cualquier propiedad 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.

Note

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 queda ningún dato no leído 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 anulativa (no correcta) puede dar lugar a que el mismo nivel remoto lo descarte antes de que lo lea el mismo nivel. 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 ingraable (RST) si los datos no leídos o no leídos permanecen en el socket.

Las desconexiones ingraciosas (RST) siempre se producirán si: se produce una terminación anómala (por ejemplo, los bloqueos de 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 obtener 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 requieren 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 Windows. El espacio de nombres 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 actual del proxy antes y después de la resolución de nombres para ayudar a acelerar el establecimiento de conexiones. 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 Windows que debe usar el proxy. Esto puede causar problemas cuando el punto de conexión remoto no espera una conexión de proxy (una solicitud HTTP CONNECT, por ejemplo). Una aplicación puede usar el método GetProxyConfigurationAsync en el objeto NetworkInformation pasando el punto de conexión remoto y el puerto del 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 el proxy está deshabilitada cuando se selecciona un adaptador de red específico.

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 errores de red (pérdida de conectividad, errores de conexión y errores de servidor, por ejemplo) pueden producirse en cualquier momento. Estos errores provocan que se produzcan excepciones. Si no lo controla la aplicación, una excepción puede hacer que el tiempo de ejecución finalice toda la aplicación.

El Windows. El espacio de nombres 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 excepciones de red específicas de forma diferente 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. Clases del Windows. El espacio de nombres Networking.Proximity admite conexiones de red con streamSocket a dispositivos cercanos que usan Bluetooth o Wi-Fi Direct. PeerFinder y las clases relacionadas del Windows. El espacio de nombres Networking.Proximity permite 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 Windows. Espacio de nombres 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 del dispositivo para 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, consulte 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, consulte el Windows. Espacio de nombres Devices.Bluetooth.Rfcomm, Cómo especificar las funcionalidades del dispositivo para Bluetooth y el ejemplo de chat 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 Windows. El espacio de nombres Networking.Sockets no se cargará a menos que la característica de Media Foundation esté habilitada. Como resultado, las aplicaciones que usan StreamSocket y las clases de socket relacionadas en el Windows. Se producirá un error en el espacio de nombres Networking.Sockets si la característica de Media Foundation está deshabilitada. Windows Server 2012 o Windows Server 2012 R2 se instala con la característica media Foundation deshabilitada.

La característica 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 reinicie. Una vez reiniciado el equipo, las clases para sockets y WebSockets en el Windows. El espacio de nombres Networking.Sockets funcionará según lo previsto.

Resolución de registros de 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 de 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.

Un DNS se puede configurar para tener 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

Nombre Description
StreamSocket()

Crea un nuevo objeto StreamSocket .

Propiedades

Nombre Description
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

Nombre Description
CancelIOAsync()

Cancela las lecturas y escrituras pendientes en un objeto StreamSocket .

Close()

Cierra el objeto StreamSocket .

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(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(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.

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)

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

Dispose()

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

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

Habilita o deshabilita la capacidad de que el agente de socket 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.

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.

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.

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.

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.

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)

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.

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