Freigeben über


StreamSocket Klasse

Definition

Unterstützt die Netzwerkkommunikation mithilfe eines Streamsockets über TCP oder Bluetooth RFCOMM in UWP-Apps.

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
Vererbung
Object Platform::Object IInspectable StreamSocket
Attribute
Implementiert

Windows-Anforderungen

Gerätefamilie
Windows 10 (eingeführt in 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (eingeführt in v1.0)
App-Funktionen
bluetooth.rfcomm ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

Beispiele

Beispielanwendungen, die diese Klasse verwenden, sind Bluetooth RFCOMM-Chatbeispiel, DatagramSocket-Beispiel (Windows 10),Socketaktivitätstrigger-Streamsocketbeispiel, StreamSocket-Beispiel (Windows 10) und Wi-Fi Direct Beispiel.

Hinweise

Die StreamSocket-Klasse unterstützt die Netzwerkkommunikation, die einen Stream socket über TCP oder Bluetooth RFCOMM in UWP-Apps verwendet.

Für eine Client-App sind die am häufigsten verwendeten Vorgänge mit einem StreamSocket die folgenden:

  • Erstellen Sie das StreamSocket.
  • Rufen Sie mithilfe der Control-Eigenschaft ein StreamSocketControl-Objekt ab, und legen Sie alle Eigenschaften für das StreamSocketControl-Objekt fest, bevor Sie eine der ConnectAsync-Methoden aufrufen.
  • Rufen Sie eine der ConnectAsync-Methoden auf, um eine Verbindung mit dem Remoteendpunkt herzustellen. Bei Bluetooth ist der Remotedienstname eine Bluetooth-Dienst-ID. Wenn sofort eine SSL/TLS-Verbindung für TCP oder eine Verschlüsselungsebene für Bluetooth erforderlich ist, kann dies mithilfe einiger ConnectAsync-Methoden angegeben werden. Wenn nach dem Senden und Empfangen einiger anfänglicher Daten für einen TCP-Socket eine SSL/TLS-Verbindung gewünscht wird, kann die UpgradeToSslAsync-Methode später aufgerufen werden, um die Verbindung zur Verwendung von SSL zu aktualisieren.
  • Rufen Sie die OutputStream-Eigenschaft ab, um Daten auf den Remotehost zu schreiben.
  • Rufen Sie die InputStream-Eigenschaft ab, um Daten vom Remotehost zu lesen.
  • Lesen und Schreiben von Daten nach Bedarf.
  • Rufen Sie die Close-Methode auf, um den Socket zu trennen, alle ausstehenden Vorgänge abzubrechen und alle nicht verwalteten Ressourcen freizugeben, die dem StreamSocket-Objekt zugeordnet sind.

Hinweis

Die Close-Methode wird von in JavaScript geschriebenen UWP-Apps verwendet. Für Apps, die mit der .NET Framework 4.5 in C# und VB.NET geschrieben wurden, wird die Close-Methode als Methode im StreamSocket verfügbar gemacht. Für apps, die in C++ geschrieben wurden, wird die Close-Methode aufgerufen, wenn sie die delete-Schlüsselwort (keyword) für das Objekt verwenden.

Durch das explizite Schließen eines StreamSocket-Objekts (Aufrufen der Close-Methode ) wird eine ordnungsgemäße Trennung sichergestellt, wenn keine ausstehenden Lese- oder Schreibvorgänge für den Socket vorhanden sind. Alle ausstehenden Lesevorgänge werden automatisch abgebrochen, und streamSocket wartet auf den Abschluss aller laufenden E/A-Vorgänge, bevor die Verbindung abgebrochen wird. Wenn nach Abschluss der laufenden E/A-Vorgänge keine ungelesenen Daten im Socket verbleiben, wird eine ordnungsgemäße Trennung (GRACEFUL DISCONNECT, FIN) garantiert. Andernfalls tritt eine unrassige Verbindung (RST) auf.

Wenn ein aktives (weiterhin verbundenes) StreamSocket-Objekt aus dem Bereich ausfällt, kann es zu einer abgebrochenen (nicht ordnungsgemäßen) Trennung führen, was dazu führen kann, dass zuvor gesendete Daten verworfen werden, bevor sie vom Remotepeer gelesen werden. Es wird dringend empfohlen, Close (die Close-Methode in JavaScript, die Methode in C# und VB.NET oder der Delete-Operator in C++) für ein StreamSocket-Objekt aufgerufen zu werden, bevor es aus dem Bereich ausgeht.

Wenn ein Lese- oder Schreibvorgang abgebrochen wird, wird der E/A-Vorgang mit dem Fehlerstatus abgeschlossen, und das zugeordnete StreamSocket-Objekt reißt die Verbindung sofort ab, was zu einer nicht ordnungsgemäßen Trennung (RST) führt, wenn ungelesene oder nicht gelesene Daten im Socket verbleiben.

Ungraceful Disconnects (RST) treten immer auf, wenn: Eine abnormale Beendigung auftritt (z. B. stürzt die App ab); oder ein abnormaler Verbindungsfehler wird vom Netzwerkstapel erkannt (z. B. TCP-Timeout für die erneute Übertragung).

Das StreamSocket-Objekt wird auch in Verbindung mit dem StreamSocketListener-Objekt verwendet, um auf eingehende Verbindungen über TCP oder Bluetooth RFCOMM in Server-Apps oder Peer-to-Peer-Apps zu lauschen. Ein StreamSocket-Objekt wird von der Socket-Eigenschaft für das ConnectionReceived-Ereignis zurückgegeben, wenn ein StreamSocketListener-Objekt eine TCP- oder Bluetooth RFCOMM-Verbindungsanforderung empfängt. Weitere Informationen finden Sie unter StreamSocketListener.

Unterstützung für Proxys

In einer UWP-App unterstützt die StreamSocket-Klasse das Herstellen einer Verbindung mit einem Remoteendpunkt, wenn Proxys erforderlich sind, um die Verbindung abzuschließen. Diese Unterstützung für Proxys ist automatisch und für die App transparent. Ein StreamSocket kann eine Verbindung herstellen, indem Proxys sowie andere Proxys authentifiziert werden, bei denen keine Authentifizierung erforderlich ist. Die Authentifizierung von Proxys funktioniert nur, wenn internet Explorer oder eine App, die die HttpClient-Klasse im Windows.Web.Http-Namespace verwendet, zuvor erfolgreich mit dem Proxy authentifiziert wurde und die zuvor für die Authentifizierung verwendeten Anmeldeinformationen weiterhin gültig sind. Die Unterstützung für die Authentifizierung von Proxys funktioniert nicht, wenn ein anderer Webbrowser als Internet Explorer verwendet wurde, um die Anmeldeinformationen für die Authentifizierung für den Proxy bereitzustellen. Das Herstellen einer Verbindung über Proxys wird nicht unterstützt, wenn eine lokale Hostadresse oder ein bestimmter Netzwerkadapter für die ConnectAsync-Methode angegeben ist.

In einer UWP-App versuchen die ConnectAsync-Methoden für das StreamSocket-Objekt, Proxys und die aktuelle Proxykonfiguration sowohl vor als auch nach der Namensauflösung zu ermitteln, um die Verbindungsherstellung zu beschleunigen. Wenn für den Endpunkt anstelle eines Dienstnamens ein Port angegeben wird, werden sowohl die Proxyermittlung als auch die Namensauflösung intern initiiert. Wenn die Proxyermittlung vor der Namensauflösung abgeschlossen ist und die CanConnectDirectly-Eigenschaft für das ProxyConfiguration-Objektfalse ist, wird eine Proxyverbindung versucht. Nach Abschluss der Namensauflösung wird die Proxyermittlung erneut mit der aufgelösten Endpunktadresse initiiert, um die aktuelle Proxykonfiguration zu bestimmen. Wenn CanConnectDirectly nach der Namensauflösung angibt, dass die App eine direkte Verbindung mit dem Remoteendpunkt herstellen kann, wird eine Socketverbindung direkt mit dem Endpunkt versucht. Wenn CanConnectDirectly nach der Namensauflösung false ist, wird eine Socketverbindung direkt mit dem Endpunkt versucht, und eine parallele Socketverbindung wird über den Proxy versucht. Die erste erfolgreiche Verbindung wird vom StreamSocket verwendet, und die andere Verbindung wird abgebrochen.

Es gibt fälle, in denen CanConnectDirectlyfalse zurückgibt, aber dies bedeutet nicht, dass Sie nicht direkt auf die Ressource zugreifen können. Ein lokales Netzwerk kann so konfiguriert werden, dass es sowohl eine Proxy- als auch eine Netzwerkadressenübersetzung (NAT) unterstützt. Das WPAD-Skript, das zum Bereitstellen von Proxyinformationen an einen Webbrowser oder HttpClient verwendet wird, teilt Windows mit, dass der Proxy verwendet werden soll. Dies kann Probleme verursachen, wenn der Remoteendpunkt keine Proxyverbindung erwartet (z. B. eine HTTP CONNECT-Anforderung). Eine App kann die GetProxyConfigurationAsync-Methode für das NetworkInformation-Objekt verwenden, das den Remoteendpunkt und den Port für den URI-Parameter übergibt, um Proxyinformationen abzurufen, um zu ermitteln, wann diese Bedingung vermutet wird. Eine Möglichkeit, proxyverbindungsanforderungen zu vermeiden, die gesendet werden, wenn ein Server nur direkte Verbindungen verarbeiten kann, besteht darin , die ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter) -Methode zu verwenden, da die proxybezogene Logik deaktiviert ist, wenn ein bestimmter Netzwerkadapter ausgewählt ist.

In einer Windows Phone 8.x-App bietet StreamSocket keine automatische Unterstützung für Proxys, da die ProxyConfiguration-Klasse auf Windows Phone nicht unterstützt wird.

Behandeln von Ausnahmen

Sie müssen Code schreiben, um Ausnahmen zu behandeln, wenn Sie asynchrone Methoden für die StreamSocket-Klasse aufrufen. Ausnahmen können sich auf Fehler bei der Parameterüberprüfung, Fehler bei der Namensauflösung und Netzwerkfehlern ergeben. Ausnahmen von Netzwerkfehlern (z. B. Verbindungsverlust, Verbindungsfehler und Serverfehler) können jederzeit auftreten. Diese Fehler haben zur Folge, dass Ausnahmen ausgelöst werden. Wenn sie nicht von Ihrer App verarbeitet wird, kann eine Ausnahme dazu führen, dass Ihre gesamte App von der Runtime beendet wird.

Der Windows.Networking.Sockets-Namespace verfügt über Features, die die Behandlung von Fehlern bei der Verwendung von Sockets vereinfachen. Die GetStatus-Methode für die SocketError-Klasse kann das HRESULT von einer Ausnahme in einen SocketErrorStatus-Enumerationswert konvertieren. Mit ihnen lassen sich spezifische Netzwerkausnahmen in der App unterschiedlich behandeln. Eine App kann auch das HRESULT aus der Ausnahme für Parameterüberprüfungsfehler verwenden, um ausführlichere Informationen zu dem Fehler zu erhalten, der die Ausnahme verursacht hat.

Weitere Informationen zu möglichen Ausnahmen und zum Behandeln von Ausnahmen finden Sie unter Behandeln von Ausnahmen in Netzwerk-Apps.

Verwenden von StreamSocket mit Näherung, Wi-Fi Direct und Bluetooth

Ihre App kann ein StreamSocket für Netzwerkverbindungen zwischen Geräten verwenden, die sich im Nahbereich befinden. Klassen im Windows.Networking.Proximity-Namespace unterstützen Netzwerkverbindungen mit einem StreamSocket zu Geräten in der Nähe, die Bluetooth oder Wi-Fi Direct verwenden. Mit den PeerFinder- und verwandten Klassen im Windows.Networking.Proximity-Namespace können Ihre App eine weitere instance Ihrer App auf einem gerät in der Nähe ermitteln. Die PeerFinder.FindAllPeersAsync-Methode sucht nach Peercomputern, auf denen dieselbe App im drahtlosen Bereich ausgeführt wird. Die PeerFinder.ConnectAsync-Methode gibt ein verbundenes StreamSocket zurück, das Ihre App verwenden kann, um Netzwerkdaten mit der Peer-App in der Nähe zu übertragen. Weitere Informationen finden Sie unter Unterstützen von Näherung und Tippen, Windows.Networking.Proximity, PeerFinder und dem Näherungsbeispiel.

Ihre App kann auch ein StreamSocket für Netzwerkverbindungen zwischen Geräten verwenden, die Wi-Fi Direct mit Klassen im Windows.Devices.WiFiDirect-Namespace verwenden. Die WiFiDirectDevice-Klasse kann verwendet werden, um andere Geräte zu suchen, die über ein Wi-Fi Direct(WFD)-fähiges Gerät verfügen. Die WiFiDirectDevice.GetDeviceSelector-Methode ruft den Gerätebezeichner für ein nahe gelegenes WFD-Gerät ab. Sobald Sie einen Verweis auf ein nahe gelegenes WFD-Gerät haben, können Sie die WiFiDirectDevice.GetConnectionEndpointPairs-Methode aufrufen, um ein EndpointPair-Objekt abzurufen. Die Methode ConnectAsync(EndpointPair) oder ConnectAsync(EndpointPair, SocketProtectionLevel) für die StreamSocket-Klasse kann dann verwendet werden, um eine Socketverbindung herzustellen. Weitere Informationen finden Sie unter Windows.Devices.WiFiDirect und WiFiDirectDevice.

Bluetooth verwendet Bluetooth-Dienst-IDs als Endpunkte für StreamSocket-Verbindungen, nicht Hostnamen oder IP-Adressen. Um streamSocket mit Bluetooth zu verwenden, muss die Bluetooth.rfcomm-Gerätefunktion im App-Manifest festgelegt werden. Weitere Informationen finden Sie unter Windows.Devices.Bluetooth.Rfcomm-Namespace , Angeben von Gerätefunktionen für Bluetooth und Beispiel für Bluetooth Rfcomm Chat.

Verwenden von StreamSocket auf Windows Server 2012

Auf Windows Server 2012 und Windows Server 2012 R2 kann die Windows.Networking.dll, die die meisten Klassen im Windows.Networking.Sockets-Namespace implementiert, nicht geladen werden, es sei denn, das Media Foundation-Feature ist aktiviert. Daher schlagen Apps, die StreamSocket und zugehörige Socketklassen im Windows.Networking.Sockets-Namespace verwenden, fehl, wenn das Media Foundation-Feature deaktiviert ist. Windows Server 2012 oder Windows Server 2012 R2-Installationen mit deaktiviertem Media Foundation-Feature.

Das Media Foundation-Feature kann auf Windows Server 2012 oder Windows Server 2012 R2 mithilfe Server-Manager oder durch Eingabe des folgenden Texts in eine Eingabeaufforderung oder ein Skript aktiviert werden:

dism /online /enable-feature /featurename:ServerMediaFoundation Nachdem das Media Foundation-Feature aktiviert wurde, wird der Benutzer aufgefordert, einen Neustart zu starten. Nachdem der Computer neu gestartet wurde, funktionieren Klassen für Sockets und WebSockets im Windows.Networking.Sockets-Namespace wie erwartet.

Auflösen von DNS-Diensteinträgen mithilfe von StreamSocket

Eine App kann mit der ZIEL-DNS-Adresse kommunizieren, die zu einem SRV-Eintrag gehört. Beispielsweise entspricht _xmpp-client._tcp.contoso.comein erweiterbarer XMPP-Dienst (Messaging and Presence Protocol) in der Contoso-Domäne . Dieser Dienstname entspricht einem DNS-Servernamen, z. B xmpp-client01.contoso.com. .

Um eine Verbindung mit der DNS-Adresse für den Server für diesen Dienst herzustellen, verwenden Sie den folgenden Methodenaufruf für einen StreamSocket-instance:

using Windows.Networking.Sockets;

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

Das Protokoll wird als TCP für StreamSocket-Instanzen abgeleitet. Die -Methode behandelt die Unterstrichzeichen.

Ein DNS kann mit einer SRV-Hierarchie konfiguriert werden. Ein DNS-SRV-Ressourceneintrag kann die folgende Form aufweisen: _xmpp-client._service01._tcp.contoso.com. Verwenden Sie für dieses Beispiel den folgenden Methodenaufruf für einen StreamSocket-instance:

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

Diese Codeausschnitte verwenden ConnectAsync. Die GetEndpointPairsAsync-Methode unterstützt eine ähnliche Verwendung, um eine Verbindung mit Diensten herzustellen.

Versionsverlauf

Windows-Version SDK-Version Mehrwert
1607 14393 GetEndpointPairsAsync(HostName,String)
1607 14393 GetEndpointPairsAsync(HostName,String,HostNameSortOptions)

Konstruktoren

StreamSocket()

Erstellt ein neues StreamSocket-Objekt .

Eigenschaften

Control

Ruft Socketsteuerelementdaten für ein StreamSocket-Objekt ab.

Information

Ruft Socketinformationen für ein StreamSocket-Objekt ab.

InputStream

Ruft den Eingabedatenstrom ab, der vom Remoteziel in einem StreamSocket-Objekt gelesen werden soll.

OutputStream

Ruft den Ausgabestream ab, der auf den Remotehost in einem StreamSocket-Objekt geschrieben werden soll.

Methoden

CancelIOAsync()

Bricht ausstehende Lese- und Schreibvorgänge über ein StreamSocket-Objekt ab.

Close()

Schließt das StreamSocket-Objekt .

ConnectAsync(EndpointPair)

Startet einen asynchronen Vorgang für ein StreamSocket-Objekt , um eine Verbindung mit einem Remotenetzwerkziel herzustellen, das als EndpointPair-Objekt angegeben ist.

ConnectAsync(EndpointPair, SocketProtectionLevel)

Startet einen asynchronen Vorgang für ein StreamSocket-Objekt , um eine Verbindung mit einem Remotenetzwerkziel herzustellen, das als EndpointPair-Objekt und socketProtectionLevel-Enumeration angegeben ist. Diese Methode kann nicht über JavaScript aufgerufen werden.

ConnectAsync(HostName, String)

Startet einen asynchronen Vorgang für ein StreamSocket-Objekt , um eine Verbindung mit einem Remotenetzwerkziel herzustellen, das durch einen Remotehostnamen und einen Remotedienstnamen angegeben wird.

ConnectAsync(HostName, String, SocketProtectionLevel)

Startet einen asynchronen Vorgang für ein StreamSocket-Objekt , um eine Verbindung mit einem Remoteziel herzustellen, das durch einen Remotehosthostnamen, einen Remotedienstnamen und einen SocketProtectionLevel angegeben wird.

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

Startet einen asynchronen Vorgang für ein StreamSocket-Objekt auf einem angegebenen lokalen Netzwerkadapter, um eine Verbindung mit einem Remoteziel herzustellen, das durch einen Remotehosthostnamen, einen Remotedienstnamen und einen SocketProtectionLevel angegeben wird.

Dispose()

Führt anwendungsspezifische Aufgaben durch, die mit der Freigabe, der Zurückgabe oder dem Zurücksetzen von nicht verwalteten Ressourcen zusammenhängen.

EnableTransferOwnership(Guid)

Ermöglicht, dass die Hintergrundaufgabe Ihrer App vom Socketbroker ausgelöst wird, wenn datenverkehr für dieses StreamSocket eingeht, während die App nicht aktiv ist.

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

Aktiviert oder deaktiviert die Möglichkeit der Hintergrundaufgabe Ihrer App, vom Socketbroker ausgelöst zu werden, wenn der Datenverkehr für dieses StreamSocket eingeht, während sich das System im verbundenen Standbymodus befindet.

GetEndpointPairsAsync(HostName, String)

Ruft eine Liste von EndpointPair-Objekten ab, die auf einem Remotehosthost und einem Remotedienstnamen basieren, die zum Senden von TCP-Paketen an ein Remotenetzwerkziel verwendet werden können.

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

Ruft eine Liste von EndpointPair-Objekten ab, die auf einem Remotehosthost und Remotedienstnamen und der zu verwendenden Sortierreihenfolge basieren.

TransferOwnership(String)

Überträgt den Besitz des StreamSocket an den Socketbrokerdienst, der die Socketaktivität überwacht und die App über eine Hintergrundaufgabe benachrichtigt, wenn Aktivität vorhanden ist.

TransferOwnership(String, SocketActivityContext)

Überträgt den Besitz des StreamSocket an den Socketbrokerdienst, der die Socketaktivität überwacht und die App über eine Hintergrundaufgabe benachrichtigt, wenn Aktivität vorhanden ist. Gibt einen neuen SocketActivityContext für den Socket an.

TransferOwnership(String, SocketActivityContext, TimeSpan)

Überträgt den Besitz des StreamSocket an den Socketbrokerdienst, der die Socketaktivität überwacht und die App über eine Hintergrundaufgabe benachrichtigt, wenn Aktivität vorhanden ist. Gibt einen neuen SocketActivityContext und eine Keep-Alive-Zeit für den Socket an.

UpgradeToSslAsync(SocketProtectionLevel, HostName)

Startet einen asynchronen Vorgang zum Upgrade eines verbundenen Sockets, um SSL für ein StreamSocket-Objekt zu verwenden.

Gilt für:

Weitere Informationen