Peer Channel Secure Chat
이 샘플에서는 피어 채널을 사용하여 다자 간 통신을 제공하는 NetPeerTcpBinding 바인딩을 암호 기반 인증과 함께 사용하는 방법을 보여 줍니다. 이 샘플은 Getting Started 샘플을 변형한 것입니다. WCF(Windows Communication Foundation)에 대한 개요를 보려면 Getting Started 샘플을 참조하십시오.
이 샘플에서 응용 프로그램 인스턴스는 자체 호스팅되는 콘솔 응용 프로그램입니다.
다른 전송 바인딩 샘플과 달리 이 샘플에서는 다자간 통신을 설명하기 위해 IChat
계약 인터페이스를 사용합니다. 모든 인스턴스는 이 계약을 구현하여 메시지를 받고 동일한 계약을 사용하는 프록시를 만들어 메시로 메시지를 보냅니다. 이 작업은 메시에 대한 DuplexChannel을 만들어 수행됩니다.
참고
이 샘플의 설치 절차 및 빌드 지침은 이 항목의 끝부분에 나와 있습니다.
샘플에 있는 바인딩 구성 프로세스를 이해하려면 다음 피어 채널 개념을 알아야 합니다.
- 피어 확인자는 메시 ID를 메시에 있는 여러 노드의 끝점 주소로 확인합니다.
- 메시는 피어 노드의 명명된 컬렉션이며 메시 ID로 식별됩니다.
- 피어 노드는 메시에 참가하는 응용 프로그램의 인스턴스입니다.
- 메시 ID는 메시의 끝점에 있는 주소의 호스트 부분을 식별합니다. 이러한 주소의 예로 "net.p2p://chatMesh/servicemodelsamples/chat" 또는 "net.p2p://broadcastMesh/servicemodelsamples/announcements"를 들 수 있으며, 여기서 chatMesh와 broadcastMesh가 메시 ID입니다.
- 메시에 참가하는 모든 클라이언트는 동일한 메시 ID를 사용하지만, 다른 경로와 서비스를 사용할 수 있습니다. 특정 끝점 주소로 보내는 메시지는 해당 주소를 사용하는 모든 피어 채널에 배달됩니다.
피어 채널이 열림에 따라 피어 노드가 열리면 피어 노드는 피어 확인자를 사용하여 메시 ID를 연결할 다른 몇 가지 피어 노드의 주소로 확인합니다. 그러면 서로 연결된 노드로 구성된 메시가 만들어지며 이 메시 전체에 메시지를 전파할 수 있게 됩니다.
PeerTransportCredentialType은 메시에 있는 피어가 서로 인증을 얻는 방식을 지정합니다. 이 속성은 바인딩 구성이나 NetPeerTcpBinding 개체에서 지정하거나 PeerTransportBindingElement를 사용하여 지정할 수 있습니다. 해당 용도에 따라 Peer 속성에 지정된 적절한 자격 증명을 갖는 ClientCredentialSettings 또는 ServiceCredentialSettings 인스턴스를 채널 팩터리 또는 ServiceHost의 동작 컬렉션에 추가해야 합니다.
- 이 샘플에서는 피어 채널 보안에 암호 인증 모드(기본 모드)를 사용합니다. 이 과정은 인접한 노드 간에 보안 연결을 설정하고 이 암호를 변환하여 교환함으로써 수행됩니다. Password가 지정된 경우 ClientCredentialSettings.Peer 속성은 유효한 암호를 전달해야 하며 필요에 따라 SetSelfCertificate를 사용하여 X509Certificate2 인스턴스를 전달해야 합니다.
바인딩은 응용 프로그램의 구성 파일에 지정됩니다. 바인딩 형식은 다음 샘플과 같이 끝점 요소의 Binding 특성에 지정됩니다.
<client>
<!-- chat instance participating in the mesh -->
<endpoint name="SecureChatEndpoint"
address="net.p2p://SecureChatMesh/servicemodelsamples/chat"
binding="netPeerTcpBinding"
bindingConfiguration="SecureChatBinding"
contract="Microsoft.ServiceModel.Samples.IChat">
</endpoint>
</client>
기본 동작과 함께 NetPeerTcpBinding 바인딩을 사용하는 경우 암호 기반 보안이 사용됩니다. 바인딩 요소는 포트, 수신 대기 IP 주소, 확인자 형식, 최대 메시지 크기, 최대 버퍼 풀 크기, 판독기 할당량, 피어 노드 인증 모드, 메시지 인증 및 시간 제한(닫기, 열기, 보내기 및 받기)을 설정하는 특성을 제공합니다.
참고: 이 샘플에서는 기본 피어 확인자(PNRP)를 사용하며 Windows Server 2003에서는 이 확인자를 사용할 수 없습니다. 따라서 Windows Server 2003에서 이 샘플을 실행하려면 사용자 지정 피어를 사용해야 합니다. 다음과 같은 사용자 지정 피어 확인자를 사용하는 샘플을 보려면 Peer Channel Chat를 참조하십시오.
<netPeerTcpBinding>
<binding configurationName="Binding1">
<resolver mode="Custom">
<customResolver
type="MyAppNameSpace.MyCustomPeerResolver, myApp"/>
</resolver>
</binding>
</netPeerTcpBinding>
MyCustomPeerResolver
를 포함하는 파일은 응용 프로그램과 함께 컴파일되어야 합니다. 플랫폼이 서로 다른 여러 컴퓨터에서 샘플을 실행하는 경우 해당 컴퓨터는 모두 동일한 확인자를 사용해야 합니다.
또한 이 채트 구현에서는 수신자 또는 발신자 인스턴스와 연결된 피어 노드를 검색하고 온라인 및 오프라인 이벤트를 등록하는 방법을 보여 줍니다. 온라인 이벤트는 피어 노드가 메시에 있는 하나 이상의 다른 피어 노드와 연결되는 경우 발생하고, 오프라인 이벤트는 피어 노드가 더 이상 메시에 있는 다른 피어 노드와 연결되어 있지 않은 경우 발생합니다.
이때 피어 채널은 Service Model Metadata Utility Tool (Svcutil.exe)와 통합되지 않습니다. 따라서 Svcutil.exe를 사용하여 발신자에 대해 형식화된 채널을 생성할 수 없습니다.
샘플을 실행하면 클라이언트에서 애칭 및 암호를 물은 다음 메시지를 보낼 준비가 되었음을 알립니다. 채트 메시지는 상대방 클라이언트 콘솔 창에 표시됩니다. 클라이언트를 종료하려면 클라이언트의 콘솔 창에서 Q 키를 누른 다음 Enter 키를 누릅니다.
추적 또는 메시지 로깅을 사용하는 경우 발신자 및 수신자 동작을 보다 자세히 모니터링할 수 있습니다. 다음 절차 단원에서는 추적 및 메시지 로깅을 사용하도록 설정하는 방법을 설명합니다.
참고
현재 인프라에서 throw할 수 있는 모든 예외를 이 샘플에서 처리하지는 않습니다. 상용/프로덕션 환경에서 이 샘플을 사용할 경우에는 적절한 예외 처리 방법을 따르십시오.
샘플을 설치, 빌드 및 실행하려면
Windows Communication Foundation 샘플의 일회 설치 절차를 수행했는지 확인합니다.
C# 또는 Visual Basic .NET 버전의 솔루션을 빌드하려면 Windows Communication Foundation 샘플 빌드의 지침을 따릅니다.
단일 시스템 구성에서 샘플을 실행하려면 Windows Communication Foundation 샘플 실행의 지침을 따릅니다.
Windows XP SP2에서 PNRP를 설치하려면(일회 설치)
- 제어판에서 프로그램 추가/제거를 두 번 클릭합니다.
- 프로그램 추가/제거 대화 상자에서 Windows 구성 요소 추가/제거를 클릭합니다.
- Windows 구성 요소 마법사에서 "네트워킹 서비스" 확인란을 선택하고 "자세히"를 클릭합니다.
- "피어-투-피어" 확인란을 선택하고 "확인"을 클릭합니다.
- Windows 구성 요소 마법사에서 "다음"을 클릭합니다.
- 설치가 완료되면 "마침"을 클릭합니다.
- 명령 셸 프롬프트에서 net start pnrpsvc 명령을 사용하여 PNRP 서비스를 시작합니다.
샘플의 여러 인스턴스를 시작하고 각 인스턴스마다 애칭과 암호를 입력합니다. 각 클라이언트의 애칭은 고유해야 하고 암호는 모든 인스턴스에서 동일해야 합니다. 애칭이 고유하고 암호가 일치할 경우 응용 프로그램의 한 인스턴스에서 보낸 채트 메시지는 나머지 모든 인스턴스에 수신됩니다. 여러 클라이언트가 동일한 애칭을 가질 수는 있지만, 애칭이 동일한 클라이언트가 보낸 메시지는 표시되지 않습니다.
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.