Compartilhar via


StreamSocket Classe

Definição

Dá suporte à comunicação de rede usando um soquete de fluxo por TCP ou Bluetooth RFCOMM em aplicativos 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
Herança
Object Platform::Object IInspectable StreamSocket
Atributos
Implementações

Requisitos do Windows

Família de dispositivos
Windows 10 (introduzida na 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (introduzida na v1.0)
Funcionalidades do aplicativo
bluetooth.rfcomm ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

Exemplos

Os aplicativos de exemplo que usam essa classe incluem exemplo de chat rfcomm bluetooth, amostra datagramSocket (Windows 10), exemplo de soquete de fluxo de gatilho de atividade de soquete de gatilho de soquete de soquete de atividade de soquete de soquete de gatilho de soquete de atividade de soquete de soquete de fluxo de soquete de fluxo de soquete de soquete de fluxo de soquete de atividade de soquete bluetooth, exemplo de StreamSocket (Windows 10)e exemplo de Wi-Fi Direct.

Comentários

A classe StreamSocket dá suporte a comunicações de rede que usam um soquete de fluxo por TCP ou Bluetooth RFCOMM em aplicativos UWP.

Para um aplicativo cliente, a sequência mais comum de operações usando um StreamSocket é a seguinte:

  • Crie o StreamSocket.
  • Obtenha um objeto StreamSocketControl usando a propriedade Control e defina todas as propriedades no objeto StreamSocketControl antes de chamar um dos métodos ConnectAsync .
  • Chame um dos métodos ConnectAsync para estabelecer uma conexão com o ponto de extremidade remoto. Para Bluetooth, o nome do serviço remoto é uma ID do Serviço Bluetooth. Se uma conexão SSL/TLS para TCP ou um nível de criptografia para Bluetooth for necessário imediatamente, isso poderá ser especificado usando alguns dos métodos ConnectAsync . Se uma conexão SSL/TLS for desejada depois de enviar e receber alguns dados iniciais de um soquete TCP, o método UpgradeToSslAsync poderá ser chamado posteriormente para atualizar a conexão para usar o SSL.
  • Obtenha a propriedade OutputStream para gravar dados no host remoto.
  • Obtenha a propriedade InputStream para ler dados do host remoto.
  • Ler e gravar dados conforme necessário.
  • Chame o método Close para desconectar o soquete, anular todas as operações pendentes e liberar todos os recursos não gerenciados associados ao objeto StreamSocket.

Observação

O método Close é usado por aplicativos UWP escritos em JavaScript. Para aplicativos gravados usando o .NET Framework 4.5 em C# e VB.NET, o método Close é exposto como o método no StreamSocket. Para aplicativos escritos em C++, o método Close será chamado ao usar a palavra-chave de exclusão no objeto .

Fechar explicitamente um objeto StreamSocket (chamando o método Close ) garantirá uma desconexão normal se nenhuma operação pendente de leitura ou gravação existir no soquete. Todas as leituras pendentes são anuladas automaticamente e o StreamSocket aguarda a conclusão de qualquer E/S em andamento antes de remover a conexão. Se nenhum dado não lido permanecer no soquete após a conclusão da E/S em andamento, uma FIN (desconexão normal) será garantida. Caso contrário, ocorrerá uma desconexão não agracioso (RST).

Quando um objeto StreamSocket ativo (ainda conectado) sai do escopo, uma desconexão anulativa (não normal) pode resultar, o que pode levar a que os dados enviados anteriormente sejam descartados antes de serem lidos pelo par remoto. É altamente recomendável que Close (o método Close em JavaScript, o método em C# e VB.NET ou o operador delete em C++) seja chamado em um objeto StreamSocket antes que ele saia do escopo.

Sempre que uma operação de leitura ou gravação é cancelada, a operação de E/S é concluída com o estado error e o objeto StreamSocket associado rasga imediatamente a conexão, o que leva a uma desconexão não completa (RST) se algum dado não lido ou não estiver no soquete.

As desconexões não arraigadas (RST) sempre ocorrerão se: ocorrer uma terminação anormal (por exemplo, o aplicativo falha); ou uma falha de conexão anormal é detectada pela pilha de rede (por exemplo, tempo limite de retransmissão de TCP).

O objeto StreamSocket também é usado em conjunto com o objeto StreamSocketListener para escutar conexões de entrada por TCP ou Bluetooth RFCOMM em aplicativos de servidor ou aplicativos ponto a ponto. Um objeto StreamSocket é retornado pela propriedade Socket no evento ConnectionReceived quando um objeto StreamSocketListener recebe uma solicitação de conexão RFCOMM TCP ou Bluetooth. Para obter mais informações, consulte StreamSocketListener.

Suporte para proxies

Em um aplicativo UWP, a classe StreamSocket dá suporte à conexão a um ponto de extremidade remoto quando os proxies são necessários para concluir a conexão. Esse suporte para proxies é automático e transparente para o aplicativo. Um StreamSocket pode estabelecer uma conexão por meio da autenticação de proxies, bem como por meio de outros proxies em que a autenticação não é necessária. A autenticação de proxies só funcionará se a Internet Explorer ou um aplicativo que usa a classe HttpClient no namespace Windows.Web.Http tiver sido autenticado com êxito com o proxy e as credenciais usadas anteriormente para a autenticação ainda forem válidas. O suporte para autenticação de proxies não funcionará se um navegador da Web diferente da Internet Explorer tiver sido usado para fornecer as credenciais de autenticação para o proxy. Não há suporte para a conexão por meio de proxies se um endereço de host local ou um adaptador de rede específico for especificado no método ConnectAsync .

Em um aplicativo UWP, os métodos ConnectAsync no objeto StreamSocket tentam descobrir proxies e a configuração de proxy atual antes e depois da resolução de nomes para ajudar a acelerar o estabelecimento da conexão. Se uma porta for especificada para o ponto de extremidade em vez de um nome de serviço, a descoberta de proxy e a resolução de nomes serão iniciadas internamente. Se a descoberta de proxy for concluída antes da resolução de nomes e a propriedade CanConnectDirectly no objeto ProxyConfiguration for falsa, uma conexão de proxy será tentada. Depois que a resolução de nomes for concluída, a descoberta de proxy será iniciada novamente com o endereço do ponto de extremidade resolvido para determinar a configuração de proxy atual. Se CanConnectDirectly indicar após a resolução de nomes que o aplicativo pode se conectar diretamente ao ponto de extremidade remoto, uma conexão de soquete será tentada diretamente para o ponto de extremidade. Se CanConnectDirectly for false após a resolução de nomes, uma conexão de soquete será tentada diretamente com o ponto de extremidade e uma conexão de soquete paralela será tentada por meio do proxy. A primeira conexão a ser bem-sucedida é usada pelo StreamSocket e a outra conexão é cancelada.

Pode haver casos em que CanConnectDirectly retorna false, mas isso não significa que você não possa acessar o recurso diretamente. Uma rede local pode ser configurada para ter suporte para uma NAT (conversão de endereços de rede e proxy). O script WPAD usado para fornecer informações de proxy para um navegador da Web ou HttpClient informa ao Windows que ele deve usar o proxy. Isso pode causar problemas quando o ponto de extremidade remoto não está esperando uma conexão de proxy (uma solicitação HTTP CONNECT, por exemplo). Um aplicativo pode usar o método GetProxyConfigurationAsync no objeto NetworkInformation passando o ponto de extremidade remoto e a porta para o parâmetro uri para recuperar informações de proxy para ajudar a determinar quando essa condição é suspeita. Uma maneira de evitar que solicitações de conexão de proxy sejam enviadas quando um servidor só pode lidar com conexões diretas é usar o método ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter), já que a lógica relacionada ao proxy é desabilitada quando um adaptador de rede específico é selecionado.

Em um aplicativo Windows Phone 8.x, o StreamSocket não fornece suporte automático para proxies, pois não há suporte para a classe ProxyConfiguration em Windows Phone.

Tratamento de exceções

Você deve escrever código para lidar com exceções ao chamar métodos assíncronos na classe StreamSocket. Exceções podem resultar de erros de validação de parâmetro, falhas de resolução de nomes e erros de rede. Exceções de erros de rede (perda de conectividade, falhas de conexão e falhas de servidor, por exemplo) podem ocorrer a qualquer momento. Esses erros geram exceções. Se não for tratada pelo aplicativo, uma exceção poderá fazer com que todo o aplicativo seja encerrado pelo runtime.

O namespace Windows.Networking.Sockets tem recursos que simplificam o tratamento de erros ao usar soquetes. O método GetStatus na classe SocketError pode converter o HRESULT de uma exceção para um valor de enumeração SocketErrorStatus . Eles são úteis para resolver exceções de rede específicas de uma outra forma em seu aplicativo. Um aplicativo também pode usar o HRESULT da exceção em erros de validação de parâmetro para saber mais informações sobre o erro que causou a exceção.

Para obter mais informações sobre possíveis exceções e como lidar com exceções, consulte Tratamento de exceções em aplicativos de rede.

Usando StreamSocket com proximidade, Wi-Fi Direct e Bluetooth

Seu aplicativo pode usar um StreamSocket para conexões de rede entre dispositivos que estão ao alcance próximo. As classes no namespace Windows.Networking.Proximity dão suporte a conexões de rede com um StreamSocket para dispositivos próximos que usam Bluetooth ou Wi-Fi Direct. O PeerFinder e as classes relacionadas no namespace Windows.Networking.Proximity permitem que seu aplicativo descubra outra instância do aplicativo em um dispositivo próximo. O método PeerFinder.FindAllPeersAsync procura computadores pares que executam o mesmo aplicativo dentro do intervalo sem fio. O método PeerFinder.ConnectAsync retorna um StreamSocket conectado que seu aplicativo pode usar para transferir dados de rede com o aplicativo par próximo. Para obter mais informações, consulte Suporte a proximidade e toques, Windows.Networking.Proximity, PeerFinder e o exemplo de proximidade.

Seu aplicativo também pode usar um StreamSocket para conexões de rede entre dispositivos que usam Wi-Fi Direct com classes no namespace Windows.Devices.WiFiDirect . A classe WiFiDirectDevice pode ser usada para localizar outros dispositivos que têm um dispositivo compatível com Wi-Fi Direct (WFD). O método WiFiDirectDevice.GetDeviceSelector obtém o identificador do dispositivo para um dispositivo WFD próximo. Depois de fazer referência a um dispositivo WFD próximo, você pode chamar o método WiFiDirectDevice.GetConnectionEndpointPairs para obter um objeto EndpointPair . O método ConnectAsync(EndpointPair) ou ConnectAsync(EndpointPair, SocketProtectionLevel) na classe StreamSocket pode ser usado para estabelecer uma conexão de soquete. Para obter mais informações, consulte Windows.Devices.WiFiDirect e WiFiDirectDevice.

O Bluetooth usa IDs de serviço Bluetooth como pontos de extremidade para conexões StreamSocket, não nomes de host ou endereços IP. Para usar um StreamSocket com Bluetooth, a funcionalidade do dispositivo bluetooth.rfcomm deve ser definida no manifesto do aplicativo. Para obter mais informações, consulte o namespace Windows.Devices.Bluetooth.Rfcomm , Como especificar recursos de dispositivo para Bluetooth e o exemplo de Chat rfcomm Bluetooth.

Usando StreamSocket no Windows Server 2012

Em Windows Server 2012 e Windows Server 2012 R2, o Windows.Networking.dll que implementa a maioria das classes no namespace Windows.Networking.Sockets falhará ao carregar, a menos que o recurso Media Foundation esteja habilitado. Como resultado, os aplicativos que usam StreamSocket e classes de soquete relacionadas no namespace Windows.Networking.Sockets falharão se o recurso do Media Foundation estiver desabilitado. Windows Server 2012 ou Windows Server 2012 R2 é instalado com o recurso Media Foundation desabilitado.

O recurso Media Foundation pode ser habilitado em Windows Server 2012 ou Windows Server 2012 R2 usando Gerenciador do Servidor ou inserindo o seguinte texto em um prompt de comando ou em um script:

dism /online /enable-feature /featurename:ServerMediaFoundation Depois que o recurso Media Foundation estiver habilitado, o usuário será solicitado a reiniciar. Depois que o computador for reiniciado, as classes para soquetes e WebSockets no namespace Windows.Networking.Sockets funcionarão conforme o esperado.

Resolvendo registros de serviço DNS usando StreamSocket

Um aplicativo pode se comunicar com o endereço DNS de destino que pertence a um registro SRV. Por exemplo, um serviço XMPP (Messaging and Presence Protocol) extensível no domínio contoso corresponde a _xmpp-client._tcp.contoso.com. Esse nome de serviço corresponde a um nome DNS do servidor, por exemplo, xmpp-client01.contoso.com.

Para se conectar ao endereço DNS do servidor desse serviço, use a seguinte chamada de método em uma instância do StreamSocket:

using Windows.Networking.Sockets;

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

O protocolo é inferido para ser TCP para instâncias StreamSocket. O método lida com os caracteres de sublinhado.

Um DNS pode ser configurado para ter uma hierarquia SRV. Um registro de recurso SRV de DNS pode ter o seguinte formato: _xmpp-client._service01._tcp.contoso.com. Para este exemplo, use a seguinte chamada de método em uma instância streamSocket:

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

Esses snippets de código usam ConnectAsync. O método GetEndpointPairsAsync dá suporte a uso semelhante para se conectar aos serviços.

Histórico de versão

Versão do Windows Versão do SDK Valor adicionado
1607 14393 GetEndpointPairsAsync(HostName,String)
1607 14393 GetEndpointPairsAsync(HostName,String,HostNameSortOptions)

Construtores

StreamSocket()

Cria um novo objeto StreamSocket .

Propriedades

Control

Obtém dados de controle de soquete em um objeto StreamSocket .

Information

Obtém informações de soquete em um objeto StreamSocket .

InputStream

Obtém o fluxo de entrada a ser lido do destino remoto em um objeto StreamSocket .

OutputStream

Obtém o fluxo de saída a ser gravado no host remoto em um objeto StreamSocket .

Métodos

CancelIOAsync()

Cancela leituras e gravações pendentes em um objeto StreamSocket .

Close()

Fecha o objeto StreamSocket .

ConnectAsync(EndpointPair)

Inicia uma operação assíncrona em um objeto StreamSocket para se conectar a um destino de rede remota especificado como um objeto EndpointPair .

ConnectAsync(EndpointPair, SocketProtectionLevel)

Inicia uma operação assíncrona em um objeto StreamSocket para se conectar a um destino de rede remoto especificado como um objeto EndpointPair e uma enumeração SocketProtectionLevel . Esse método não pode ser chamado do JavaScript.

ConnectAsync(HostName, String)

Inicia uma operação assíncrona em um objeto StreamSocket para se conectar a um destino de rede remota especificado por um nome de host remoto e um nome de serviço remoto.

ConnectAsync(HostName, String, SocketProtectionLevel)

Inicia uma operação assíncrona em um objeto StreamSocket para se conectar a um destino remoto especificado por um nome de host remoto, um nome de serviço remoto e um SocketProtectionLevel.

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

Inicia uma operação assíncrona em um objeto StreamSocket em um adaptador de rede local especificado para se conectar a um destino remoto especificado por um nome de host remoto, um nome de serviço remoto e um SocketProtectionLevel.

Dispose()

Realiza tarefas definidas pelo aplicativo associadas à liberação ou à redefinição de recursos não gerenciados.

EnableTransferOwnership(Guid)

Permite que a tarefa em segundo plano do aplicativo seja disparada pelo agente de soquete quando o tráfego para esse StreamSocket chegar enquanto o aplicativo não estiver ativo.

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

Habilita ou desabilita a capacidade da tarefa em segundo plano do aplicativo ser disparada pelo agente de soquete quando o tráfego para esse StreamSocket chega enquanto o sistema está em espera conectado.

GetEndpointPairsAsync(HostName, String)

Obtém uma lista de objetos EndpointPair com base em um nome de host remoto e um nome de serviço remoto que podem ser usados para enviar pacotes TCP para um destino de rede remota.

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

Obtém uma lista de objetos EndpointPair com base em um nome de host remoto e no nome do serviço remoto e na ordem de classificação a ser usada.

TransferOwnership(String)

Transfere a propriedade do StreamSocket para o serviço de intermediação de soquete, que monitora a atividade do soquete e notifica o aplicativo por meio de uma tarefa em segundo plano se houver alguma atividade.

TransferOwnership(String, SocketActivityContext)

Transfere a propriedade do StreamSocket para o serviço de intermediação de soquete, que monitora a atividade do soquete e notifica o aplicativo por meio de uma tarefa em segundo plano se houver alguma atividade. Especifica um novo SocketActivityContext para o soquete.

TransferOwnership(String, SocketActivityContext, TimeSpan)

Transfere a propriedade do StreamSocket para o serviço de intermediação de soquete, que monitora a atividade do soquete e notifica o aplicativo por meio de uma tarefa em segundo plano se houver alguma atividade. Especifica um novo SocketActivityContext e um tempo de vida para o soquete.

UpgradeToSslAsync(SocketProtectionLevel, HostName)

Inicia uma operação assíncrona para atualizar um soquete conectado para usar o SSL em um objeto StreamSocket .

Aplica-se a

Confira também