Lingua

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

Requisiti Descrizione
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 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 esempio direct.

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 più comune di operazioni che usano streamSocket sono le seguenti:

  • 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 opzione 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 eventuali operazioni in sospeso e rilasciare tutte le risorse non gestite associate all'oggetto StreamSocket.

Annotazioni

Il metodo Close viene usato dalle app UWP scritte in JavaScript. Per le app scritte usando .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 sono presenti 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 nongra (RST).

Quando un oggetto StreamSocket attivo (ancora connesso) esce dall'ambito, può verificarsi una disconnessione interrotta (non normale), che può causare l'eliminazione dei dati inviati in precedenza prima che vengano 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 di errore e l'oggetto StreamSocket associato rimuove immediatamente la connessione, che porta a 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, 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 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 dei proxy e tramite altri proxy in cui non è necessaria l'autenticazione. L'autenticazione dei proxy funziona solo se Internet Explorer o un'app che usa la classe HttpClient nel Windows. Lo spazio dei nomi Web.Http è stato autenticato in precedenza 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 nel metodo ConnectAsync viene specificato un indirizzo host locale o una scheda di rete specifica.

In un'app UWP, i metodi ConnectAsync nell'oggetto StreamSocket tentano di individuare proxy e la configurazione del proxy corrente sia prima che dopo la risoluzione dei nomi per velocizzare la definizione della connessione. Se viene specificata una porta per l'endpoint anziché un nome del 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 di nuovo 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 riuscita 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 in modo da 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 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 sul proxy per determinare quando questa condizione è sospetta. Un modo per evitare l'invio di richieste di connessione proxy quando un server può gestire solo le 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.

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 generano eccezioni. Se non gestita dall'app, un'eccezione può causare la terminazione dell'intera app da parte del runtime.

Windows. Lo spazio dei nomi 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 . Questo può essere utile per gestire eccezioni di rete specifiche 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. Classi nel Windows. Lo spazio dei nomi Networking.Proximity supporta le connessioni di rete con streamSocket ai dispositivi vicini che usano Bluetooth o Wi-Fi Direct. PeerFinder e le classi correlate nella Windows. Lo spazio dei nomi Networking.Proximity consente 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 nella Windows. Spazio dei nomi Devices.WiFiDirect. La classe WiFiDirectDevice può essere usata per individuare altri dispositivi che dispongono di un dispositivo con supporto per 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 nomi host o indirizzi IP. Per usare streamSocket con Bluetooth, la funzionalità del dispositivo bluetooth.rfcomm deve essere impostata nel manifesto dell'app. Per altre informazioni, vedere il Windows. Spazio dei nomi Devices.Bluetooth.Rfcomm, Come specificare le funzionalità del dispositivo per Bluetooth e l'esempio Bluetooth Rfcomm Chat.

Uso di StreamSocket in Windows Server 2012

In Windows Server 2012 e Windows Server 2012 R2, il Windows.Networking.dll che implementa la maggior parte delle classi nella Windows. Lo spazio dei nomi Networking.Sockets non verrà caricato a meno che non sia abilitata la funzionalità Media Foundation. Di conseguenza, le app che usano StreamSocket e le classi socket correlate nel Windows. Lo spazio dei nomi Networking.Sockets avrà 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 nel Windows. Lo spazio dei nomi Networking.Sockets funzionerà come previsto.

Risoluzione dei record del servizio DNS tramite StreamSocket

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

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 su un'istanza 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

Nome Descrizione
StreamSocket()

Crea un nuovo oggetto StreamSocket .

Proprietà

Nome Descrizione
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

Nome Descrizione
CancelIOAsync()

Annulla letture e scritture in sospeso su un oggetto StreamSocket .

Close()

Chiude l'oggetto StreamSocket .

ConnectAsync(EndpointPair, SocketProtectionLevel)

Avvia un'operazione asincrona in 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(EndpointPair)

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

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.

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 del servizio remoto e un SocketProtectionLevel.

ConnectAsync(HostName, String)

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

Dispose()

Esegue attività definite dall'applicazione associate alla liberazione, al rilascio o alla reimpostazione di risorse non gestite.

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.

EnableTransferOwnership(Guid)

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

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.

GetEndpointPairsAsync(HostName, String)

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

TransferOwnership(String, SocketActivityContext, TimeSpan)

Trasferisce la proprietà di StreamSocket al servizio di brokering socket, che monitora l'attività del 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.

TransferOwnership(String, SocketActivityContext)

Trasferisce la proprietà di StreamSocket al servizio di brokering socket, che monitora l'attività del 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)

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

UpgradeToSslAsync(SocketProtectionLevel, HostName)

Avvia un'operazione asincrona per aggiornare un socket connesso per l'uso di SSL in un oggetto StreamSocket .

Si applica a

Vedi anche