Partager via


StreamSocket Classe

Définition

Prend en charge la communication réseau à l’aide d’un socket de flux sur TCP ou Bluetooth RFCOMM dans les applications 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
Héritage
Object Platform::Object IInspectable StreamSocket
Attributs
Implémente

Configuration requise pour Windows

Famille d’appareils
Windows 10 (introduit dans 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (introduit dans v1.0)
Fonctionnalités de l’application
bluetooth.rfcomm ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

Exemples

Les exemples d’applications qui utilisent cette classe incluent l’exemple de conversation RFCOMM Bluetooth, l’exemple DatagramSocket (Windows 10), l’exemple de socket de flux de déclencheur d’activité socket, l’exemple StreamSocket (Windows 10) et Wi-Fi Direct exemple.

Remarques

La classe StreamSocket prend en charge les communications réseau qui utilisent un socket de flux via TCP ou Bluetooth RFCOMM dans les applications UWP.

Pour une application cliente, la séquence d’opérations la plus courante à l’aide d’un StreamSocket est la suivante :

  • Créez le StreamSocket.
  • Obtenez un objet StreamSocketControl à l’aide de la propriété Control et définissez toutes les propriétés de l’objet StreamSocketControl avant d’appeler l’une des méthodes ConnectAsync .
  • Appelez l’une des méthodes ConnectAsync pour établir une connexion avec le point de terminaison distant. Pour Bluetooth, le nom du service distant est un ID de service Bluetooth. Si une connexion SSL/TLS pour TCP ou un niveau de chiffrement pour Bluetooth est requise immédiatement, vous pouvez le spécifier à l’aide de certaines méthodes ConnectAsync . Si une connexion SSL/TLS est souhaitée après l’envoi et la réception de certaines données initiales pour un socket TCP, la méthode UpgradeToSslAsync peut être appelée ultérieurement pour mettre à niveau la connexion afin d’utiliser SSL.
  • Obtenez la propriété OutputStream pour écrire des données sur l’hôte distant.
  • Obtenez la propriété InputStream pour lire les données de l’hôte distant.
  • Lire et écrire des données en fonction des besoins.
  • Appelez la méthode Close pour déconnecter le socket, abandonner toutes les opérations en attente et libérer toutes les ressources non managées associées à l’objet StreamSocket.

Notes

La méthode Close est utilisée par les applications UWP écrites en JavaScript. Pour les applications écrites à l’aide du .NET Framework 4.5 en C# et VB.NET, la méthode Close est exposée en tant que méthode sur le StreamSocket. Pour les applications écrites en C++, la méthode Close est appelée lors de l’utilisation de la mot clé de suppression sur l’objet.

La fermeture explicite d’un objet StreamSocket (appelant la méthode Close ) garantit une déconnexion normale si aucune opération de lecture ou d’écriture en attente n’existe sur le socket. Toutes les lectures en attente sont automatiquement abandonnées et le StreamSocket attend que toutes les E/S en cours se terminent avant de détruire la connexion. Si aucune donnée non lus ne reste sur le socket une fois l’E/S en cours terminée, une déconnexion normale (FIN) est garantie. Sinon, une déconnexion non honteuse (RST) se produit.

Lorsqu’un objet StreamSocket actif (toujours connecté) sort de l’étendue, une déconnexion avortée (non grace) peut se produire, ce qui peut entraîner l’abandon des données précédemment envoyées avant d’être lues par l’homologue distant. Il est vivement recommandé d’appeler Close (la méthode Close en JavaScript, la méthode en C# et VB.NET, ou l’opérateur delete en C++) sur un objet StreamSocket avant qu’il ne sorte de l’étendue.

Chaque fois qu’une opération de lecture ou d’écriture est annulée, l’opération d’E/S se termine avec l’état d’erreur et l’objet StreamSocket associé détruit immédiatement la connexion, ce qui conduit à une déconnexion non honteuse (RST) si des données non lues ou non contenues restent sur le socket.

Les déconnexions non scandaleuses (RST) se produisent toujours si : une arrêt anormal se produit (par exemple, l’application se bloque) ; ou un échec de connexion anormal est détecté par la pile réseau (par exemple, délai d’expiration de la retransmite TCP).

L’objet StreamSocket est également utilisé conjointement avec l’objet StreamSocketListener pour écouter les connexions entrantes via TCP ou Bluetooth RFCOMM dans les applications serveur ou les applications d’égal à égal. Un objet StreamSocket est retourné par la propriété Socket sur l’événement ConnectionReceived lorsqu’un objet StreamSocketListener reçoit une demande de connexion TCP ou Bluetooth RFCOMM. Pour plus d’informations, consultez StreamSocketListener.

Prise en charge des proxys

Dans une application UWP, la classe StreamSocket prend en charge la connexion à un point de terminaison distant lorsque des proxys sont nécessaires pour terminer la connexion. Cette prise en charge des proxys est automatique et transparente pour l’application. Un StreamSocket peut établir une connexion par le biais de l’authentification de proxys ainsi que d’autres proxys pour lesquels l’authentification n’est pas nécessaire. L’authentification des proxys ne fonctionne que si Internet Explorer ou une application qui utilise la classe HttpClient dans l’espace de noms Windows.Web.Http s’est précédemment authentifié avec succès auprès du proxy et si les informations d’identification utilisées précédemment pour l’authentification sont toujours valides. La prise en charge de l’authentification des proxys ne fonctionne pas si un navigateur web autre qu’Internet Explorer a été utilisé pour fournir les informations d’identification d’authentification au proxy. La connexion via des proxys n’est pas prise en charge si une adresse hôte locale ou une carte réseau spécifique est spécifiée sur la méthode ConnectAsync .

Dans une application UWP, les méthodes ConnectAsync de l’objet StreamSocket tentent de découvrir les proxys et la configuration de proxy actuelle avant et après la résolution de noms pour accélérer l’établissement de la connexion. Si un port est spécifié pour le point de terminaison plutôt que pour un nom de service, la découverte du proxy et la résolution de noms sont lancées en interne. Si la découverte du proxy se termine avant la résolution de noms et que la propriété CanConnectDirectly de l’objet ProxyConfiguration a la valeur false, une connexion proxy est tentée. Une fois la résolution de noms terminée, la découverte de proxy est à nouveau lancée avec l’adresse de point de terminaison résolue pour déterminer la configuration actuelle du proxy. Si CanConnectDirectly indique après la résolution de noms que l’application peut se connecter directement au point de terminaison distant, une connexion de socket est tentée directement vers le point de terminaison. Si CanConnectDirectly a la valeur false après la résolution de noms, une connexion de socket est tentée directement vers le point de terminaison et une connexion de socket parallèle est tentée via le proxy. La première connexion à réussir est utilisée par streamSocket et l’autre connexion est annulée.

Il peut y avoir des cas où CanConnectDirectly retourne false, mais cela ne signifie pas que vous ne pouvez pas accéder directement à la ressource. Un réseau local peut être configuré pour prendre en charge à la fois un proxy et une traduction d’adresses réseau (NAT). Le script WPAD utilisé pour fournir des informations de proxy à un navigateur web ou HttpClient indique à Windows qu’il doit utiliser le proxy. Cela peut entraîner des problèmes lorsque le point de terminaison distant n’attend pas de connexion proxy (une requête HTTP CONNECT, par exemple). Une application peut utiliser la méthode GetProxyConfigurationAsync sur l’objet NetworkInformation en passant le point de terminaison distant et le port pour le paramètre uri afin de récupérer des informations de proxy afin de déterminer quand cette condition est suspectée. Un moyen d’éviter l’envoi de demandes de connexion proxy lorsqu’un serveur ne peut gérer que les connexions directes consiste à utiliser la méthode ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter), car la logique liée au proxy est désactivée lorsqu’une carte réseau spécifique est sélectionnée.

Dans une application Windows Phone 8.x, streamSocket ne fournit pas de prise en charge automatique des proxys, car la classe ProxyConfiguration n’est pas prise en charge sur Windows Phone.

Gestion des exceptions

Vous devez écrire du code pour gérer les exceptions lorsque vous appelez des méthodes asynchrones sur la classe StreamSocket. Les exceptions peuvent résulter d’erreurs de validation de paramètres, d’échecs de résolution de noms et d’erreurs réseau. Des exceptions aux erreurs réseau (perte de connectivité, échecs de connexion et échecs de serveur, par exemple) peuvent se produire à tout moment. Ces erreurs donnent lieu à la levée d’exceptions. Si elle n’est pas gérée par votre application, une exception peut entraîner l’arrêt de l’ensemble de votre application par le runtime.

L’espace de noms Windows.Networking.Sockets dispose de fonctionnalités qui simplifient la gestion des erreurs lors de l’utilisation de sockets. La méthode GetStatus de la classe SocketError peut convertir le HRESULT d’une exception en valeur d’énumération SocketErrorStatus . Ceci peut s’avérer utile pour gérer différemment certaines exceptions réseau dans votre application. Une application peut également utiliser le HRESULT de l’exception sur les erreurs de validation de paramètre pour obtenir des informations plus détaillées sur l’erreur à l’origine de l’exception.

Pour plus d’informations sur les exceptions possibles et sur la façon de gérer les exceptions, consultez Gestion des exceptions dans les applications réseau.

Utilisation de StreamSocket avec proximité, Wi-Fi direct et Bluetooth

Votre application peut utiliser un StreamSocket pour les connexions réseau entre les appareils qui se trouvent dans une plage proche. Les classes de l’espace de noms Windows.Networking.Proximity prennent en charge les connexions réseau avec un StreamSocket aux appareils à proximité qui utilisent Bluetooth ou Wi-Fi Direct. Les classes PeerFinder et associées de l’espace de noms Windows.Networking.Proximity permettent à votre application de découvrir un autre instance de votre application sur un appareil proche. La méthode PeerFinder.FindAllPeersAsync recherche les ordinateurs homologues qui exécutent la même application dans la plage sans fil. La méthode PeerFinder.ConnectAsync retourne un StreamSocket connecté que votre application peut utiliser pour transférer des données réseau avec l’application homologue à proximité. Pour plus d’informations, consultez Prise en charge de la proximité et de l’appui,Windows.Networking.Proximity, PeerFinder et l’exemple De proximité.

Votre application peut également utiliser un StreamSocket pour les connexions réseau entre des appareils qui utilisent Wi-Fi Direct avec des classes dans l’espace de noms Windows.Devices.WiFiDirect . La classe WiFiDirectDevice peut être utilisée pour localiser d’autres appareils qui ont un appareil Wi-Fi Direct (WFD). La méthode WiFiDirectDevice.GetDeviceSelector obtient l’identificateur d’appareil d’un appareil WFD à proximité. Une fois que vous disposez d’une référence à un appareil WFD à proximité, vous pouvez appeler la méthode WiFiDirectDevice.GetConnectionEndpointPairs pour obtenir un objet EndpointPair . La méthode ConnectAsync(EndpointPair) ou ConnectAsync(EndpointPair, SocketProtectionLevel) sur la classe StreamSocket peut ensuite être utilisée pour établir une connexion de socket. Pour plus d’informations, consultez Windows.Devices.WiFiDirect et WiFiDirectDevice.

Bluetooth utilise des ID de service Bluetooth comme points de terminaison pour les connexions StreamSocket, et non comme noms d’hôte ou adresses IP. Pour utiliser un StreamSocket avec Bluetooth, la fonctionnalité d’appareil bluetooth.rfcomm doit être définie dans le manifeste de l’application. Pour plus d’informations, consultez l’espace de noms Windows.Devices.Bluetooth.Rfcomm , Comment spécifier des fonctionnalités d’appareil pour Bluetooth et l’exemple de conversation Bluetooth Rfcomm.

Utilisation de StreamSocket sur Windows Server 2012

Sur Windows Server 2012 et Windows Server 2012 R2, le Windows.Networking.dll qui implémente la plupart des classes dans l’espace de noms Windows.Networking.Sockets ne parvient pas à se charger, sauf si la fonctionnalité Media Foundation est activée. Par conséquent, les applications qui utilisent StreamSocket et les classes de socket associées dans l’espace de noms Windows.Networking.Sockets échouent si la fonctionnalité Media Foundation est désactivée. Windows Server 2012 ou Windows Server 2012 R2 s’installe avec la fonctionnalité Media Foundation désactivée.

La fonctionnalité Media Foundation peut être activée sur Windows Server 2012 ou Windows Server 2012 R2 à l’aide de Gestionnaire de serveur ou en entrant le texte suivant dans une invite de commandes ou un script :

dism /online /enable-feature /featurename:ServerMediaFoundation Une fois la fonctionnalité Media Foundation activée, l’utilisateur est invité à redémarrer. Une fois l’ordinateur redémarré, les classes pour sockets et WebSockets dans l’espace de noms Windows.Networking.Sockets fonctionnent comme prévu.

Résolution des enregistrements de service DNS à l’aide de StreamSocket

Une application peut communiquer avec l’adresse DNS cible qui appartient à un enregistrement SRV. Par exemple, un service XMPP (Messaging and Presence Protocol) extensible dans le domaine Contoso correspond à _xmpp-client._tcp.contoso.com. Ce nom de service correspond à un nom DNS de serveur, par exemple. xmpp-client01.contoso.com

Pour vous connecter à l’adresse DNS du serveur pour ce service, utilisez l’appel de méthode suivant sur un instance StreamSocket :

using Windows.Networking.Sockets;

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

Le protocole est déduit comme étant TCP pour les instances StreamSocket. La méthode traite des caractères de soulignement.

Un DNS peut être configuré pour avoir une hiérarchie SRV. Un enregistrement de ressource SRV DNS peut avoir la forme suivante : _xmpp-client._service01._tcp.contoso.com. Pour cet exemple, utilisez l’appel de méthode suivant sur un instance StreamSocket :

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

Ces extraits de code utilisent ConnectAsync. La méthode GetEndpointPairsAsync prend en charge une utilisation similaire pour se connecter aux services.

Historique des versions

Version de Windows Version du SDK Valeur ajoutée
1607 14393 GetEndpointPairsAsync(HostName,String)
1607 14393 GetEndpointPairsAsync(HostName,String,HostNameSortOptions)

Constructeurs

StreamSocket()

Crée un objet StreamSocket .

Propriétés

Control

Obtient les données de contrôle de socket sur un objet StreamSocket .

Information

Obtient des informations de socket sur un objet StreamSocket .

InputStream

Obtient le flux d’entrée à lire à partir de la destination distante sur un objet StreamSocket .

OutputStream

Obtient le flux de sortie à écrire sur l’hôte distant sur un objet StreamSocket .

Méthodes

CancelIOAsync()

Annule les lectures et écritures en attente sur un objet StreamSocket .

Close()

Ferme l’objet StreamSocket .

ConnectAsync(EndpointPair)

Démarre une opération asynchrone sur un objet StreamSocket pour se connecter à une destination réseau distante spécifiée en tant qu’objet EndpointPair .

ConnectAsync(EndpointPair, SocketProtectionLevel)

Démarre une opération asynchrone sur un objet StreamSocket pour se connecter à une destination réseau distante spécifiée sous la forme d’un objet EndpointPair et d’une énumération SocketProtectionLevel . Cette méthode n’est pas appelable à partir de JavaScript.

ConnectAsync(HostName, String)

Démarre une opération asynchrone sur un objet StreamSocket pour se connecter à une destination réseau distante spécifiée par un nom d’hôte distant et un nom de service distant.

ConnectAsync(HostName, String, SocketProtectionLevel)

Démarre une opération asynchrone sur un objet StreamSocket pour se connecter à une destination distante spécifiée par un nom d’hôte distant, un nom de service distant et un SocketProtectionLevel.

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

Démarre une opération asynchrone sur un objet StreamSocket sur une carte réseau locale spécifiée pour se connecter à une destination distante spécifiée par un nom d’hôte distant, un nom de service distant et un SocketProtectionLevel.

Dispose()

Exécute les tâches définies par l'application associées à la libération ou à la redéfinition des ressources non managées.

EnableTransferOwnership(Guid)

Permet à la tâche en arrière-plan de votre application d’être déclenchée par le répartiteur de sockets lorsque le trafic de ce StreamSocket arrive alors que l’application n’est pas active.

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

Active ou désactive la capacité de la tâche en arrière-plan de votre application à être déclenchée par le répartiteur de sockets lorsque le trafic pour ce StreamSocket arrive alors que le système est en veille connectée.

GetEndpointPairsAsync(HostName, String)

Obtient une liste d’objets EndpointPair en fonction d’un nom d’hôte distant et d’un nom de service distant qui peuvent être utilisés pour envoyer des paquets TCP à une destination réseau distante.

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

Obtient une liste d’objets EndpointPair en fonction d’un nom d’hôte distant et d’un nom de service distant et de l’ordre de tri à utiliser.

TransferOwnership(String)

Transfère la propriété du StreamSocket au service de répartiteur de sockets, qui surveille l’activité du socket et avertit l’application par le biais d’une tâche en arrière-plan en cas d’activité.

TransferOwnership(String, SocketActivityContext)

Transfère la propriété du StreamSocket au service de répartiteur de sockets, qui surveille l’activité du socket et avertit l’application par le biais d’une tâche en arrière-plan en cas d’activité. Spécifie un nouveau SocketActivityContext pour le socket.

TransferOwnership(String, SocketActivityContext, TimeSpan)

Transfère la propriété du StreamSocket au service de répartiteur de sockets, qui surveille l’activité du socket et avertit l’application par le biais d’une tâche en arrière-plan en cas d’activité. Spécifie un nouveau SocketActivityContext et une durée de vie pour le socket.

UpgradeToSslAsync(SocketProtectionLevel, HostName)

Démarre une opération asynchrone pour mettre à niveau un socket connecté afin d’utiliser SSL sur un objet StreamSocket .

S’applique à

Voir aussi