다음을 통해 공유


StreamSocket 클래스

정의

UWP 앱에서 TCP 또는 Bluetooth RFCOMM을 통해 스트림 소켓을 사용하여 네트워크 통신을 지원합니다.

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
상속
Object Platform::Object IInspectable StreamSocket
특성
구현

Windows 요구 사항

디바이스 패밀리
Windows 10 (10.0.10240.0에서 도입되었습니다.)
API contract
Windows.Foundation.UniversalApiContract (v1.0에서 도입되었습니다.)
앱 기능
bluetooth.rfcomm ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

예제

이 클래스를 사용하는 샘플 애플리케이션에는 Bluetooth RFCOMM 채팅 샘플, DatagramSocket 샘플(Windows 10), 소켓 활동 트리거 스트림 소켓 샘플, StreamSocket 샘플(Windows 10)Wi-Fi Direct 샘플이 포함됩니다.

설명

StreamSocket 클래스는 UWP 앱에서 TCP 또는 Bluetooth RFCOMM을 통해 스트림 소켓을 사용하는 네트워크 통신을 지원합니다.

클라이언트 앱의 경우 StreamSocket을 사용하는 가장 일반적인 작업 시퀀스는 다음과 같습니다.

  • StreamSocket을 만듭니다.
  • Control 속성을 사용하여 StreamSocketControl 개체를 가져와서 ConnectAsync 메서드 중 하나를 호출하기 전에 StreamSocketControl 개체의 속성을 설정합니다.
  • ConnectAsync 메서드 중 하나를 호출하여 원격 엔드포인트와의 연결을 설정합니다. Bluetooth의 경우 원격 서비스 이름은 Bluetooth 서비스 ID입니다. TCP에 대한 SSL/TLS 연결 또는 Bluetooth에 대한 암호화 수준이 즉시 필요한 경우 일부 ConnectAsync 메서드를 사용하여 지정할 수 있습니다. TCP 소켓에 대한 초기 데이터를 보내고 받은 후 SSL/TLS 연결이 필요한 경우 나중에 UpgradeToSslAsync 메서드를 호출하여 SSL을 사용하도록 연결을 업그레이드할 수 있습니다.
  • 원격 호스트에 데이터를 쓸 OutputStream 속성을 가져옵니다.
  • InputStream 속성을 가져와 원격 호스트에서 데이터를 읽습니다.
  • 필요에 따라 데이터를 읽고 씁니다.
  • Close 메서드를 호출하여 소켓의 연결을 끊고, 보류 중인 작업을 중단하고, StreamSocket 개체와 연결된 관리되지 않는 모든 리소스를 해제합니다.

참고

Close 메서드는 JavaScript로 작성된 UWP 앱에서 사용됩니다. C# 및 VB.NET .NET Framework 4.5를 사용하여 작성된 앱의 경우 Close 메서드는 StreamSocket의 메서드로 노출됩니다. C++로 작성된 앱의 경우 개체에서 삭제 키워드(keyword) 사용할 때 Close 메서드가 호출됩니다.

StreamSocket 개체를 명시적으로 닫으면( Close 메서드 호출) 소켓에 보류 중인 읽기 또는 쓰기 작업이 없는 경우 정상적인 연결 끊김이 보장됩니다. 보류 중인 모든 읽기가 자동으로 중단되고 StreamSocket은 연결을 끊기 전에 진행 중인 I/O가 완료될 때까지 기다립니다. 진행 중인 I/O가 완료된 후 소켓에 읽지 않은 데이터가 남아 있지 않으면 FIN(정상 연결 끊기)이 발생합니다. 그렇지 않으면 RST(비정상적인 연결 끊기)가 발생합니다.

활성(여전히 연결된) StreamSocket 개체가 scope 꺼지면 중단(정상이 아닌) 연결이 끊어질 수 있으므로 원격 피어에서 읽기 전에 이전에 보낸 데이터가 삭제될 수 있습니다. Scope 나가기 전에 StreamSocket 개체에서 Close(JavaScript의 Close 메서드, C# 및 VB.NET 메서드 또는 C++의 delete 연산자)를 호출하는 것이 좋습니다.

읽기 또는 쓰기 작업이 취소될 때마다 I/O 작업이 오류 상태로 완료되고 연결된 StreamSocket 개체가 연결을 즉시 중단하여 읽지 않거나 읽지 않은 데이터가 소켓에 남아 있는 경우 RST(편차 연결 끊기)가 발생합니다.

비정상적인 종료(예: 앱 크래시)가 발생하는 경우 RST(편차 연결 끊기)는 항상 발생합니다. 또는 네트워킹 스택에서 비정상적인 연결 오류가 검색됩니다(예: TCP 재전송 시간 제한).

StreamSocket 개체는 StreamSocketListener 개체와 함께 서버 앱 또는 피어 투 피어 앱에서 TCP 또는 Bluetooth RFCOMM을 통해 들어오는 연결을 수신 대기하는 데도 사용됩니다. StreamSocketListener 개체가 TCP 또는 Bluetooth RFCOMM 연결 요청을 받으면 ConnectionReceived 이벤트의 Socket 속성에서 StreamSocket 개체가 반환됩니다. 자세한 내용은 StreamSocketListener를 참조하세요.

프록시 지원

UWP 앱에서 StreamSocket 클래스는 연결을 완료하기 위해 프록시가 필요한 경우 원격 엔드포인트에 대한 연결을 지원합니다. 프록시에 대한 이러한 지원은 앱에 자동적이고 투명합니다. StreamSocket은 인증이 필요하지 않은 다른 프록시뿐만 아니라 프록시를 인증하여 연결을 설정할 수 있습니다. 프록시 인증은 인터넷 Explorer 또는 Windows.Web.Http 네임스페이스에서 HttpClient 클래스를 사용하는 앱이 이전에 프록시로 성공적으로 인증되었으며 이전에 인증에 사용된 자격 증명이 여전히 유효한 경우에만 작동합니다. 프록시에 인증 자격 증명을 제공하는 데 Internet Explorer 이외의 웹 브라우저가 사용된 경우 프록시 인증 지원이 작동하지 않습니다. 로컬 호스트 주소 또는 특정 네트워크 어댑터가 ConnectAsync 메서드에 지정된 경우 프록시를 통한 연결은 지원되지 않습니다.

UWP 앱에서 StreamSocket 개체의 ConnectAsync 메서드는 이름 확인 전후에 프록시 및 현재 프록시 구성을 검색하여 연결 설정 속도를 향상합니다. 서비스 이름이 아닌 엔드포인트에 포트를 지정하면 프록시 검색 및 이름 확인이 내부적으로 시작됩니다. 이름 확인 전에 프록시 검색이 완료되고 ProxyConfiguration 개체의 CanConnectDirectly 속성이 false이면 프록시 연결이 시도됩니다. 이름 확인이 완료되면 현재 프록시 구성을 확인하기 위해 확인된 엔드포인트 주소로 프록시 검색이 다시 시작됩니다. CanConnectDirectly가 앱이 원격 엔드포인트에 직접 연결할 수 있는 이름 확인 후 를 나타내는 경우 소켓 연결이 엔드포인트에 직접 시도됩니다. 이름 확인 후 CanConnectDirectlyfalse 이면 소켓 연결이 엔드포인트에 직접 시도되고 프록시를 통해 병렬 소켓 연결이 시도됩니다. 성공할 첫 번째 연결은 StreamSocket에서 사용되며 다른 연결은 취소됩니다.

CanConnectDirectlyfalse를 반환하는 경우가 있을 수 있지만 리소스에 직접 액세스할 수 없다는 의미는 아닙니다. 프록시 및 NAT(네트워크 주소 변환)를 모두 지원하도록 로컬 네트워크를 구성할 수 있습니다. 웹 브라우저 또는 HttpClient 에 프록시 정보를 제공하는 데 사용되는 WPAD 스크립트는 프록시를 사용해야 한다고 Windows에 알릴 수 있습니다. 이렇게 하면 원격 엔드포인트에 프록시 연결(예: HTTP CONNECT 요청)이 없을 때 문제가 발생할 수 있습니다. 앱은 uri 매개 변수에 대한 원격 엔드포인트 및 포트를 전달하는 NetworkInformation 개체의 GetProxyConfigurationAsync 메서드를 사용하여 프록시 정보를 검색하여 이 조건이 의심되는 시기를 확인할 수 있습니다. 서버가 직접 연결만 처리할 수 있을 때 프록시 연결 요청이 전송되지 않도록 하는 방법은 특정 네트워크 어댑터를 선택할 때 프록시 관련 논리가 비활성화되므로 ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter) 메서드를 사용하는 것입니다.

Windows Phone 8.x 앱에서는 ProxyConfiguration 클래스가 Windows Phone 지원되지 않으므로 StreamSocket은 프록시에 대한 자동 지원을 제공하지 않습니다.

예외 처리

StreamSocket 클래스에서 비동기 메서드를 호출할 때 예외를 처리하는 코드를 작성해야 합니다. 매개 변수 유효성 검사 오류, 이름 확인 실패 및 네트워크 오류로 인해 예외가 발생할 수 있습니다. 네트워크 오류(예: 연결 손실, 연결 오류 및 서버 오류)의 예외는 언제든지 발생할 수 있습니다. 이러한 오류로 인해 예외가 발생합니다. 앱에서 처리하지 않으면 예외로 인해 런타임에 의해 전체 앱이 종료될 수 있습니다.

Windows.Networking.Sockets 네임스페이스에는 소켓을 사용할 때 오류 처리를 간소화하는 기능이 있습니다. SocketError 클래스의 GetStatus 메서드는 예외에서 SocketErrorStatus 열거형 값으로 HRESULT를 변환할 수 있습니다. 특정 네트워크 예외를 앱에서 다르게 처리하는 데 유용합니다. 또한 앱은 매개 변수 유효성 검사 오류에 대한 예외의 HRESULT 를 사용하여 예외를 발생시킨 오류에 대한 자세한 정보를 확인할 수 있습니다.

가능한 예외 및 예외를 처리하는 방법에 대한 자세한 내용은 네트워크 앱에서 예외 처리를 참조하세요.

근접, Wi-Fi Direct 및 Bluetooth에서 StreamSocket 사용

앱은 가까운 범위 내에 있는 디바이스 간의 네트워크 연결에 StreamSocket을 사용할 수 있습니다. Windows.Networking.Proximity 네임스페이스의 클래스는 Bluetooth 또는 Wi-Fi Direct를 사용하는 주변 디바이스에 대한 StreamSocket을 사용하는 네트워크 연결을 지원합니다. Windows.Networking.Proximity 네임스페이스의 PeerFinder 및 관련 클래스를 사용하면 앱이 가까운 디바이스에서 앱의 다른 instance 검색할 수 있습니다. PeerFinder.FindAllPeersAsync 메서드는 무선 범위 내에서 동일한 앱을 실행하는 피어 컴퓨터를 찾습니다. PeerFinder.ConnectAsync 메서드는 앱이 가까운 피어 앱으로 네트워크 데이터를 전송하는 데 사용할 수 있는 연결된 StreamSocket을 반환합니다. 자세한 내용은 근접 및 탭 지원, Windows.Networking.Proximity, PeerFinder근접 샘플 을 참조하세요.

앱은 Windows.Devices.WiFiDirect 네임스페이스의 클래스와 함께 Wi-Fi Direct를 사용하는 디바이스 간의 네트워크 연결에 StreamSocket을 사용할 수도 있습니다. WiFiDirectDevice 클래스를 사용하여 Wi-Fi Direct(WFD) 지원 디바이스가 있는 다른 디바이스를 찾을 수 있습니다. WiFiDirectDevice.GetDeviceSelector 메서드는 근처의 WFD 디바이스에 대한 디바이스 식별자를 가져옵니다. 근처의 WFD 디바이스에 대한 참조가 있으면 WiFiDirectDevice.GetConnectionEndpointPairs 메서드를 호출하여 EndpointPair 개체를 가져올 수 있습니다. StreamSocket 클래스의 ConnectAsync(EndpointPair) 또는 ConnectAsync(EndpointPair, SocketProtectionLevel) 메서드를 사용하여 소켓 연결을 설정할 수 있습니다. 자세한 내용은 Windows.Devices.WiFiDirectWiFiDirectDevice를 참조하세요.

Bluetooth는 호스트 이름 또는 IP 주소가 아닌 StreamSocket 연결의 엔드포인트로 Bluetooth 서비스 ID를 사용합니다. Bluetooth에서 StreamSocket을 사용하려면 앱 매니페스트에서 bluetooth.rfcomm 디바이스 기능을 설정해야 합니다. 자세한 내용은 Windows.Devices.Bluetooth.Rfcomm 네임스페이스, Bluetooth에 대한 디바이스 기능을 지정하는 방법Bluetooth Rfcomm 채팅 샘플을 참조하세요.

Windows Server 2012 StreamSocket 사용

Windows Server 2012 및 Windows Server 2012 R2에서 Media Foundation 기능을 사용하도록 설정하지 않으면 Windows.Networking.Sockets 네임스페이스에서 대부분의 클래스를 구현하는Windows.Networking.dll로드되지 않습니다. 따라서 Media Foundation 기능을 사용하지 않도록 설정하면 Windows.Networking.Sockets 네임스페이스에서 StreamSocket 및 관련 소켓 클래스를 사용하는 앱이 실패합니다. Media Foundation 기능이 사용하지 않도록 설정된 Windows Server 2012 또는 Windows Server 2012 R2 설치

Media Foundation 기능은 서버 관리자 사용하거나 명령 프롬프트 또는 스크립트에 다음 텍스트를 입력하여 Windows Server 2012 또는 Windows Server 2012 R2에서 사용하도록 설정할 수 있습니다.

dism /online /enable-feature /featurename:ServerMediaFoundation Media Foundation 기능을 사용하도록 설정하면 사용자에게 다시 시작하라는 메시지가 표시됩니다. 컴퓨터를 다시 시작하면 Windows.Networking.Sockets 네임스페이스의 소켓 및 WebSocket에 대한 클래스가 예상대로 작동합니다.

StreamSocket을 사용하여 DNS 서비스 레코드 확인

앱은 SRV 레코드에 속하는 대상 DNS 주소와 통신할 수 있습니다. 예를 들어 Contoso 도메인의 XMPP(확장 가능한 메시징 및 현재 상태 프로토콜) 서비스는 에 해당합니다 _xmpp-client._tcp.contoso.com. 해당 서비스 이름은 서버 DNS 이름(예: xmpp-client01.contoso.com)에 해당합니다.

해당 서비스에 대한 서버의 DNS 주소에 연결하려면 StreamSocket instance 다음 메서드 호출을 사용합니다.

using Windows.Networking.Sockets;

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

프로토콜은 StreamSocket 인스턴스에 대한 TCP로 유추됩니다. 메서드는 밑줄 문자를 처리합니다.

DNS는 SRV 계층 구조를 갖도록 구성할 수 있습니다. DNS SRV 리소스 레코드에는 형식 _xmpp-client._service01._tcp.contoso.com이 있을 수 있습니다. 이 예제에서는 StreamSocket instance 다음 메서드 호출을 사용합니다.

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

이러한 코드 조각은 ConnectAsync를 사용합니다. GetEndpointPairsAsync 메서드는 서비스에 연결하는 유사한 사용을 지원합니다.

버전 기록

Windows 버전 SDK 버전 추가된 값
1607 14393 GetEndpointPairsAsync(HostName,String)
1607 14393 GetEndpointPairsAsync(HostName,String,HostNameSortOptions)

생성자

StreamSocket()

StreamSocket 개체를 만듭니다.

속성

Control

StreamSocket 개체의 소켓 제어 데이터를 가져옵니다.

Information

StreamSocket 개체에 대한 소켓 정보를 가져옵니다.

InputStream

StreamSocket 개체의 원격 대상에서 읽을 입력 스트림을 가져옵니다.

OutputStream

StreamSocket 개체의 원격 호스트에 쓸 출력 스트림을 가져옵니다.

메서드

CancelIOAsync()

StreamSocket 개체를 통해 보류 중인 읽기 및 쓰기를 취소합니다.

Close()

StreamSocket 개체를 닫습니다.

ConnectAsync(EndpointPair)

EndpointPair 개체로 지정된 원격 네트워크 대상에 연결하기 위해 StreamSocket 개체에 대한 비동기 작업을 시작합니다.

ConnectAsync(EndpointPair, SocketProtectionLevel)

StreamSocket 개체에서 비동기 작업을 시작하여 EndpointPair 개체 및 SocketProtectionLevel 열거형으로 지정된 원격 네트워크 대상에 연결합니다. 이 메서드는 JavaScript에서 호출할 수 없습니다.

ConnectAsync(HostName, String)

StreamSocket 개체에서 비동기 작업을 시작하여 원격 호스트 이름 및 원격 서비스 이름으로 지정된 원격 네트워크 대상에 연결합니다.

ConnectAsync(HostName, String, SocketProtectionLevel)

StreamSocket 개체에서 비동기 작업을 시작하여 원격 호스트 이름, 원격 서비스 이름 및 SocketProtectionLevel로 지정된 원격 대상에 연결합니다.

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

지정된 로컬 네트워크 어댑터의 StreamSocket 개체에서 비동기 작업을 시작하여 원격 호스트 이름, 원격 서비스 이름 및 SocketProtectionLevel로 지정된 원격 대상에 연결합니다.

Dispose()

관리되지 않는 리소스의 확보, 해제 또는 다시 설정과 관련된 애플리케이션 정의 작업을 수행합니다.

EnableTransferOwnership(Guid)

앱이 활성 상태가 아닌 동안 이 StreamSocket 에 대한 트래픽이 도착할 때 소켓 브로커에 의해 앱의 백그라운드 작업을 트리거할 수 있도록 합니다.

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

시스템이 연결된 대기 상태인 동안 이 StreamSocket 에 대한 트래픽이 도착할 때 소켓 브로커가 앱의 백그라운드 작업을 트리거하는 기능을 사용하거나 사용하지 않도록 설정합니다.

GetEndpointPairsAsync(HostName, String)

원격 네트워크 대상으로 TCP 패킷을 보내는 데 사용할 수 있는 원격 호스트 이름 및 원격 서비스 이름을 기반으로 하는 EndpointPair 개체 목록을 가져옵니다.

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

원격 호스트 이름 및 원격 서비스 이름 및 사용할 정렬 순서를 기반으로 하는 EndpointPair 개체 목록을 가져옵니다.

TransferOwnership(String)

StreamSocket의 소유권을 소켓 조정 서비스로 전송합니다. 이 서비스는 소켓 작업을 모니터링하고 활동이 있는 경우 백그라운드 작업을 통해 앱에 알깁니다.

TransferOwnership(String, SocketActivityContext)

StreamSocket의 소유권을 소켓 조정 서비스로 전송합니다. 이 서비스는 소켓 작업을 모니터링하고 활동이 있는 경우 백그라운드 작업을 통해 앱에 알깁니다. 소켓에 대한 새 SocketActivityContext 를 지정합니다.

TransferOwnership(String, SocketActivityContext, TimeSpan)

StreamSocket의 소유권을 소켓 조정 서비스로 전송합니다. 이 서비스는 소켓 작업을 모니터링하고 활동이 있는 경우 백그라운드 작업을 통해 앱에 알깁니다. 새 SocketActivityContext 를 지정하고 소켓에 대한 연결 유지 시간을 지정합니다.

UpgradeToSslAsync(SocketProtectionLevel, HostName)

StreamSocket 개체에서 SSL을 사용하도록 연결된 소켓을 업그레이드하는 비동기 작업을 시작합니다.

적용 대상

추가 정보