Condividi tramite


StreamSocket Classe

Definizione

Supporta la comunicazione di rete usando un socket di flusso su TCP o Bluetooth RFCOMM nelle app 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
Ereditarietà
Object Platform::Object IInspectable StreamSocket
Attributi
Implementazioni

Requisiti Windows

Famiglia di dispositivi
Windows 10 (è stato introdotto in 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (è stato introdotto in v1.0)
Funzionalità dell'app
bluetooth.rfcomm ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

Esempio

Le applicazioni di esempio che usano questa classe includono l'esempio di chat RFCOMM Bluetooth, l'esempio DatagramSocket (Windows 10), l'esempio di socket del trigger di attività Socket, l'esempio streamSocket (Windows 10) e Wi-Fi Direct esempio.

Commenti

La classe StreamSocket supporta le comunicazioni di rete che usano un socket di flusso su TCP o Bluetooth RFCOMM nelle app UWP.

Per un'app client, la sequenza di operazioni più comune che usa streamSocket è la seguente:

  • Creare StreamSocket.
  • Ottenere un oggetto StreamSocketControl usando la proprietà Control e impostare le proprietà nell'oggetto StreamSocketControl prima di chiamare uno dei metodi ConnectAsync .
  • Chiamare uno dei metodi ConnectAsync per stabilire una connessione con l'endpoint remoto. Per Bluetooth, il nome del servizio remoto è un ID servizio Bluetooth. Se è necessaria immediatamente una connessione SSL/TLS per TCP o un livello di crittografia per Bluetooth, è possibile specificare questa connessione usando alcuni dei metodi ConnectAsync . Se si desidera una connessione SSL/TLS dopo l'invio e la ricezione di alcuni dati iniziali per un socket TCP, è possibile chiamare il metodo UpgradeToSslAsync in un secondo momento per aggiornare la connessione per l'uso di SSL.
  • Ottenere la proprietà OutputStream per scrivere dati nell'host remoto.
  • Ottenere la proprietà InputStream per leggere i dati dall'host remoto.
  • Leggere e scrivere i dati in base alle esigenze.
  • Chiamare il metodo Close per disconnettere il socket, interrompere le operazioni in sospeso e rilasciare tutte le risorse non gestite associate all'oggetto StreamSocket.

Nota

Il metodo Close viene usato dalle app UWP scritte in JavaScript. Per le app scritte con .NET Framework 4.5 in C# e VB.NET, il metodo Close viene esposto come metodo in StreamSocket. Per le app scritte in C++, il metodo Close verrà chiamato quando si usa la parola chiave delete nell'oggetto .

La chiusura esplicita di un oggetto StreamSocket (chiamata al metodo Close ) garantisce una disconnessione normale se nel socket non esistono operazioni di lettura o scrittura in sospeso. Tutte le letture in sospeso vengono interrotte automaticamente e StreamSocket attende il completamento di eventuali operazioni di I/O in corso prima di arrestare la connessione. Se non rimangono dati non letti sul socket al termine dell'I/O in corso, viene garantita una normale disconnessione (FIN). In caso contrario, si verifica una disconnessione non vergognosa (RST).

Quando un oggetto StreamSocket attivo (ancora connesso) esce dall'ambito, può verificarsi una disconnessione interrotta (non normale), che può portare a dati inviati in precedenza eliminati prima di essere letti dal peer remoto. È consigliabile chiamare Close (il metodo Close in JavaScript, il metodo in C# e VB.NET o l'operatore delete in C++) su un oggetto StreamSocket prima di uscire dall'ambito.

Ogni volta che viene annullata un'operazione di lettura o scrittura, l'operazione di I/O viene completata con lo stato Error e l'oggetto StreamSocket associato rimuove immediatamente la connessione, determinando una disconnessione non irreversibile (RST) se i dati non letti o non inviati rimangono sul socket.

Le disconnessioni non riuscite (RST) si verificheranno sempre se si verifica una terminazione anomala (ad esempio, arresti anomali dell'app); o un errore di connessione anomalo viene rilevato dallo stack di rete ( ad esempio, il timeout di ritrasmissione TCP).

L'oggetto StreamSocket viene usato anche insieme all'oggetto StreamSocketListener per ascoltare le connessioni in ingresso su TCP o Bluetooth RFCOMM nelle app server o nelle app peer-to-peer. Un oggetto StreamSocket viene restituito dalla proprietà Socket sull'evento ConnectionReceived quando un oggetto StreamSocketListener riceve una richiesta di connessione RFCOMM TCP o Bluetooth. Per altre informazioni, vedere StreamSocketListener.

Supporto per i proxy

In un'app UWP la classe StreamSocket supporta la connessione a un endpoint remoto quando sono necessari proxy per completare la connessione. Questo supporto per i proxy è automatico e trasparente per l'app. StreamSocket può stabilire una connessione tramite l'autenticazione di proxy e tramite altri proxy in cui l'autenticazione non è necessaria. L'autenticazione dei proxy funziona solo se Internet Explorer o un'app che usa la classe HttpClient nello spazio dei nomi Windows.Web.Http ha eseguito correttamente l'autenticazione con il proxy e le credenziali usate in precedenza per l'autenticazione sono ancora valide. Il supporto per l'autenticazione dei proxy non funziona se è stato usato un Web browser diverso da Internet Explorer per fornire le credenziali di autenticazione al proxy. La connessione tramite proxy non è supportata se si specifica un indirizzo host locale o una scheda di rete specifica nel metodo ConnectAsync .

In un'app UWP, i metodi ConnectAsync nell'oggetto StreamSocket tentano di individuare proxy e la configurazione del proxy corrente prima e dopo la risoluzione dei nomi per velocizzare la creazione della connessione. Se viene specificata una porta per l'endpoint anziché un nome di servizio, l'individuazione del proxy e la risoluzione dei nomi vengono avviate internamente. Se l'individuazione proxy viene completata prima della risoluzione dei nomi e la proprietà CanConnectDirectly nell'oggetto ProxyConfiguration è false, verrà tentata una connessione proxy. Al termine della risoluzione dei nomi, l'individuazione proxy viene avviata nuovamente con l'indirizzo dell'endpoint risolto per determinare la configurazione del proxy corrente. Se CanConnectDirectly indica dopo la risoluzione dei nomi che l'app può connettersi direttamente all'endpoint remoto, verrà tentata una connessione socket direttamente all'endpoint. Se CanConnectDirectly è false dopo la risoluzione dei nomi, verrà tentata una connessione socket direttamente all'endpoint e viene tentata una connessione socket parallela tramite il proxy. La prima connessione a cui eseguire l'operazione viene usata da StreamSocket e l'altra connessione viene annullata.

In alcuni casi CanConnectDirectly restituisce false, ma non significa che non è possibile accedere direttamente alla risorsa. Una rete locale può essere configurata per avere il supporto sia per un proxy che per nat (Network Address Translation). Lo script WPAD usato per fornire informazioni proxy a un Web browser o a HttpClient indica a Windows che deve usare il proxy. Ciò può causare problemi quando l'endpoint remoto non prevede una connessione proxy ,ad esempio una richiesta HTTP CONNECT. Un'app può usare il metodo GetProxyConfigurationAsync nell'oggetto NetworkInformation passando l'endpoint remoto e la porta per il parametro URI per recuperare le informazioni del proxy per determinare quando questa condizione è sospetta. Un modo per evitare l'invio di richieste di connessione proxy quando un server può gestire solo connessioni dirette consiste nell'usare il metodo ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter), poiché la logica correlata al proxy è disabilitata quando viene selezionata una scheda di rete specifica.

In un'app Windows Phone 8.x, StreamSocket non fornisce il supporto automatico per i proxy perché la classe ProxyConfiguration non è supportata in Windows Phone.

Gestione delle eccezioni

È necessario scrivere codice per gestire le eccezioni quando si chiamano metodi asincroni nella classe StreamSocket. Le eccezioni possono derivare da errori di convalida dei parametri, errori di risoluzione dei nomi ed errori di rete. Le eccezioni da errori di rete (perdita di connettività, errori di connessione e errori del server, ad esempio) possono verificarsi in qualsiasi momento. Questi errori causano la generazione di eccezioni. Se non viene gestita dall'app, un'eccezione può causare la terminazione dell'intera app da parte del runtime.

Lo spazio dei nomi Windows.Networking.Sockets include funzionalità che semplificano la gestione degli errori quando si usano i socket. Il metodo GetStatus nella classe SocketError può convertire HRESULT da un'eccezione a un valore di enumerazione SocketErrorStatus . Ciò può risultare utile per gestire specifiche eccezioni di rete in modo diverso nell'app. Un'app può anche usare HRESULT dall'eccezione sugli errori di convalida dei parametri per ottenere informazioni più dettagliate sull'errore che ha causato l'eccezione.

Per altre informazioni sulle possibili eccezioni e su come gestire le eccezioni, vedere Gestione delle eccezioni nelle app di rete.

Uso di StreamSocket con prossimità, Wi-Fi Direct e Bluetooth

L'app può usare streamSocket per le connessioni di rete tra dispositivi che si trovano all'interno di un intervallo di chiusura. Le classi nello spazio dei nomi Windows.Networking.Proximity supportano le connessioni di rete con un oggetto StreamSocket ai dispositivi vicini che usano Bluetooth o Wi-Fi Direct. Le classi PeerFinder e correlate nello spazio dei nomi Windows.Networking.Proximity consentono all'app di individuare un'altra istanza dell'app in un dispositivo nelle vicinanze. Il metodo PeerFinder.FindAllPeersAsync cerca i computer peer che eseguono la stessa app all'interno dell'intervallo wireless. Il metodo PeerFinder.ConnectAsync restituisce un oggetto StreamSocket connesso che l'app può usare per trasferire i dati di rete con l'app peer nelle vicinanze. Per altre informazioni, vedere Supporto della prossimità e del tocco, Windows.Networking.Proximity, PeerFinder e l'esempio di prossimità.

L'app può anche usare streamSocket per le connessioni di rete tra dispositivi che usano Wi-Fi Direct con classi nello spazio dei nomi Windows.Devices.WiFiDirect . La classe WiFiDirectDevice può essere usata per individuare altri dispositivi che dispongono di un dispositivo con supporto Wi-Fi Direct (WFD). Il metodo WiFiDirectDevice.GetDeviceSelector ottiene l'identificatore del dispositivo per un dispositivo WFD nelle vicinanze. Dopo aver ottenuto un riferimento a un dispositivo WFD nelle vicinanze, è possibile chiamare il metodo WiFiDirectDevice.GetConnectionEndpointPairs per ottenere un oggetto EndpointPair . Il metodo ConnectAsync(EndpointPair) o ConnectAsync(EndpointPair, SocketProtectionLevel) nella classe StreamSocket può quindi essere usato per stabilire una connessione socket. Per altre informazioni, vedere Windows.Devices.WiFiDirect e WiFiDirectDevice.

Bluetooth usa gli ID del servizio Bluetooth come endpoint per le connessioni StreamSocket, non i nomi host o gli indirizzi IP. Per usare StreamSocket con Bluetooth, la funzionalità del dispositivo bluetooth.rfcomm deve essere impostata nel manifesto dell'app. Per altre informazioni, vedere lo spazio dei nomi Windows.Devices.Bluetooth.Rfcomm , Come specificare le funzionalità del dispositivo per Bluetooth e l'esempio Di chat Rfcomm Bluetooth.

Uso di StreamSocket in Windows Server 2012

In Windows Server 2012 e Windows Server 2012 R2, la Windows.Networking.dll che implementa la maggior parte delle classi nello spazio dei nomi Windows.Networking.Sockets non verrà caricata a meno che la funzionalità Media Foundation non sia abilitata. Di conseguenza, le app che usano StreamSocket e le classi socket correlate nello spazio dei nomi Windows.Networking.Sockets avranno esito negativo se la funzionalità Media Foundation è disabilitata. Windows Server 2012 o Windows Server 2012 R2 viene installato con la funzionalità Media Foundation disabilitata.

La funzionalità Media Foundation può essere abilitata in Windows Server 2012 o Windows Server 2012 R2 usando Server Manager o immettendo il testo seguente in un prompt dei comandi o in uno script:

dism /online /enable-feature /featurename:ServerMediaFoundation Dopo aver abilitato la funzionalità Media Foundation, all'utente viene richiesto di riavviare. Dopo il riavvio del computer, le classi per socket e WebSocket nello spazio dei nomi Windows.Networking.Sockets funzioneranno come previsto.

Risoluzione dei record del servizio DNS tramite StreamSocket

Un'app può comunicare con l'indirizzo DNS di destinazione appartenente a un record SRV. Ad esempio, un servizio XMPP (Extensible Messaging and Presence Protocol) nel dominio Contoso corrisponde a _xmpp-client._tcp.contoso.com. Il nome del servizio corrisponde a un nome DNS del server, ad esempio xmpp-client01.contoso.com.

Per connettersi all'indirizzo DNS per il server per tale servizio, usare la chiamata al metodo seguente in un'istanza di StreamSocket:

using Windows.Networking.Sockets;

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

Il protocollo viene dedotto come TCP per le istanze di StreamSocket. Il metodo gestisce i caratteri di sottolineatura.

Un DNS può essere configurato per avere una gerarchia SRV. I record di risorse SRV DNS possono avere il formato seguente: _xmpp-client._service01._tcp.contoso.com. Per questo esempio, usare la chiamata al metodo seguente in un'istanza di StreamSocket:

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

Questi frammenti di codice usano ConnectAsync. Il metodo GetEndpointPairsAsync supporta un utilizzo simile per connettersi ai servizi.

Cronologia delle versioni

Versione di Windows Versione dell'SDK Valore aggiunto
1607 14393 GetEndpointPairsAsync(HostName,String)
1607 14393 GetEndpointPairsAsync(HostName,String,HostNameSortOptions)

Costruttori

StreamSocket()

Crea un nuovo oggetto StreamSocket .

Proprietà

Control

Ottiene i dati del controllo socket in un oggetto StreamSocket .

Information

Ottiene informazioni sul socket su un oggetto StreamSocket .

InputStream

Ottiene il flusso di input da leggere dalla destinazione remota in un oggetto StreamSocket .

OutputStream

Ottiene il flusso di output da scrivere nell'host remoto in un oggetto StreamSocket .

Metodi

CancelIOAsync()

Annulla letture e scritture in sospeso su un oggetto StreamSocket .

Close()

Chiude l'oggetto StreamSocket .

ConnectAsync(EndpointPair)

Avvia un'operazione asincrona su un oggetto StreamSocket per connettersi a una destinazione di rete remota specificata come oggetto EndpointPair .

ConnectAsync(EndpointPair, SocketProtectionLevel)

Avvia un'operazione asincrona su un oggetto StreamSocket per connettersi a una destinazione di rete remota specificata come oggetto EndpointPair e un'enumerazione SocketProtectionLevel . Questo metodo non è chiamabile da JavaScript.

ConnectAsync(HostName, String)

Avvia un'operazione asincrona su un oggetto StreamSocket per connettersi a una destinazione di rete remota specificata da un nome host remoto e da un nome di servizio remoto.

ConnectAsync(HostName, String, SocketProtectionLevel)

Avvia un'operazione asincrona su un oggetto StreamSocket per connettersi a una destinazione remota specificata da un nome host remoto, un nome di servizio remoto e un SocketProtectionLevel.

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

Avvia un'operazione asincrona su un oggetto StreamSocket in una scheda di rete locale specificata per connettersi a una destinazione remota specificata da un nome host remoto, un nome del servizio remoto e un SocketProtectionLevel.

Dispose()

Esegue attività definite dall'applicazione, come rilasciare o reimpostare risorse non gestite.

EnableTransferOwnership(Guid)

Abilita l'attività in background dell'app da attivare dal gestore socket quando arriva il traffico per questo StreamSocket mentre l'app non è attiva.

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

Abilita o disabilita la possibilità che l'attività in background dell'app venga attivata dal gestore socket quando arriva il traffico per questo StreamSocket mentre il sistema è in standby connesso.

GetEndpointPairsAsync(HostName, String)

Ottiene un elenco di oggetti EndpointPair basati su un nome host remoto e un nome di servizio remoto che possono essere utilizzati per inviare pacchetti TCP a una destinazione di rete remota.

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

Ottiene un elenco di oggetti EndpointPair in base a un nome host remoto e al nome del servizio remoto e all'ordinamento da utilizzare.

TransferOwnership(String)

Trasferisce la proprietà di StreamSocket al servizio di brokering socket, che monitora l'attività socket e invia una notifica all'app tramite un'attività in background se è presente un'attività.

TransferOwnership(String, SocketActivityContext)

Trasferisce la proprietà di StreamSocket al servizio di brokering socket, che monitora l'attività socket e invia una notifica all'app tramite un'attività in background se è presente un'attività. Specifica un nuovo SocketActivityContext per il socket.

TransferOwnership(String, SocketActivityContext, TimeSpan)

Trasferisce la proprietà di StreamSocket al servizio di brokering socket, che monitora l'attività socket e invia una notifica all'app tramite un'attività in background se è presente un'attività. Specifica un nuovo SocketActivityContext e un tempo keep-alive per il socket.

UpgradeToSslAsync(SocketProtectionLevel, HostName)

Avvia un'operazione asincrona per aggiornare un socket connesso per usare SSL in un oggetto StreamSocket .

Si applica a

Vedi anche