WCF 채팅 샘플
업데이트: 2007년 11월
채팅 샘플은 PeerChannel을 사용하여 단체 채팅 응용 프로그램을 구현하는 방법을 보여 줍니다. 채팅 응용 프로그램 인스턴스가 보낸 메시지를 다른 모든 인스턴스가 받습니다.
설치 샘플 및 지침을 얻으려면
다음 중 하나 이상을 수행합니다.
도움말 메뉴에서 샘플을 클릭합니다.
추가 정보 파일에서 샘플에 대한 정보를 확인합니다.
Visual Studio 2008 Samples 웹 사이트를 방문합니다. 이 웹 사이트에서 최신 버전의 샘플을 얻을 수 있습니다.
Visual Studio가 설치되어 있는 컴퓨터에서 샘플을 찾습니다. 기본적으로 샘플과 추가 정보 파일은 drive:\Program Files\Microsoft Visual Studio 9.0\Samples\lcid에 설치되어 있습니다. Visual Studio Express Editions의 경우에는 모든 샘플이 온라인에 있습니다.
자세한 내용은 샘플 파일 찾기를 참조하십시오.
보안 정보: |
---|
이 샘플 코드는 개념을 설명하기 위한 것으로 개념과 관련된 코드만을 보여 줍니다. 특정 환경에 대한 보안 요구 사항을 충족하지 못 할 수 있고 표시된 그대로 사용하면 안됩니다. 안전하고 강력한 프로젝트를 만들려면 보안 및 오류 처리 코드를 추가하는 것이 좋습니다. Microsoft에서는 어떠한 보증도 없이 “있는 그대로” 이 샘플 코드를 제공합니다. |
이 샘플을 실행하려면
솔루션 탐색기에서 .sln 파일을 엽니다.
채팅 샘플은 클라이언트 및 서비스 응용 프로그램이 아니므로 단계에서 클라이언트 또는 서비스를 참조할 때는 해당 단계가 샘플의 개별 인스턴스에 적용된다는 것입니다.
F5 키를 눌러 채팅 응용 프로그램을 실행합니다.
원하는 만큼의 인스턴스(Visual Basic 설치 경로\Projects\Chat\Instance\Bin\Debug\Instance.exe에 있는 명명된 인스턴스)를 시작합니다. 특정 클라이언트 인스턴스에서 보내는 메시지를 구분해 주는 애칭을 입력하여 시작합니다. 이 이름을 입력한 후에 바로 채팅 메시지를 망상 조직에 보낼 수 있습니다. 메시지는 고유 멤버 이름을 가지고 있는 다른 모든 인스턴스에 전송되어야 합니다. 즉, 동일한 이름의 클라이언트에서 보낸 메시지는 표시되지 않고 단일 클라이언트의 자체 메시지는 해당 클라이언트의 콘솔 창에 전송되지 않습니다.
세부 항목
채팅 샘플은 클라이언트 및 서비스 응용 프로그램이 아닙니다. 이 샘플은 진정한 피어-투-피어 응용 프로그램으로서 각 인스턴스가 다른 인스턴스의 피어 역할을 합니다. IChat 양방향 계약을 사용하여 각 인스턴스가 다른 인스턴스에 메시지를 보내고 다른 인스턴스의 메시지를 받을 수 있습니다.
주요 개념
PeerChannel은 WCF(Windows Communication Foundation)의 단체 P2P(피어-투-피어) 통신 기술입니다. 이 기술을 사용하면 안전하고 확장 가능한 안정적인 메시징을 구현할 수 있습니다. PeerChannel을 활용할 수 있는 단체 응용 프로그램의 일반적인 예는 채팅과 같은 공동 작업 응용 프로그램입니다. 채팅에서는 여러 명의 사람이 서버 없이 피어-투-피어 방식으로 서로 통신합니다. PeerChannel은 소비자 및 기업 시나리오 모두에서 P2P 공동 작업, 콘텐츠 배포, 부하 분산 및 분산 처리를 가능하게 합니다.
PeerChannel은 다음과 같은 새 개념을 소개합니다.
망상 조직은 서로 통신하고 고유한 망상 조직 ID로 식별되는 피어 노드의 명명된 컬렉션(상호 연결된 그래프)입니다.
참고: 망상 조직에 있는 활성 노드는 망상 조직 이름을 게시합니다. 이 이름을 통해 다른 노드가 해당 노드를 찾을 수 있습니다. 망상 조직은 변화하는 멤버 자격에 맞춰 조정되고, 노드가 끊임없이 망상 조직에 조인하고 떠나는 환경에 적응할 수 있는 연결성을 갖추고 있으며, 트래픽 패턴에 맞춰 동적으로 최적화됩니다.
망상 조직에 있는 활성 노드는 망상 조직 이름을 게시합니다. 이 이름을 통해 다른 노드가 해당 노드를 찾을 수 있습니다. 망상 조직은 변화하는 멤버 자격에 맞춰 조정되고, 노드가 끊임없이 망상 조직에 조인하고 떠나는 환경에 적응할 수 있는 연결성을 갖추고 있으며, 트래픽 패턴을 기반으로 동적으로 최적화됩니다.
피어 노드는 망상 조직의 끝점입니다. 서로 다른 망상 조직에 참여하는 여러 개의 피어 노드가 한 응용 프로그램에 있을 수 있습니다.
피어 확인자는 망상 조직 ID를 통해 망상 조직에 있는 노드의 끝점 주소를 확인합니다. 피어 노드는 이 주소를 사용하여 망상 조직에 있는 다른 노드에 연결합니다. 이를 통해 메시지가 망상 조직 전체에 전파됩니다.
Chat는 Windows Forms 응용 프로그램입니다. 채팅 응용 프로그램의 각 인스턴스는 끝점 주소가 동일한 IDuplexChannel을 만듭니다. 채팅 응용 프로그램의 모든 인스턴스가 동일한 주소를 사용하므로 한 응용 프로그램 인스턴스가 보낸 메시지를 해당 피어 채널에 있는 다른 모든 인스턴스가 받게 됩니다.
채팅 응용 프로그램은 IChat 양방향 계약을 정의하고 구현합니다. ServiceModel이 단일 요청/복수 응답 패러다임을 지원하지 않으므로 IChat 계약에서는 단방향 작업만 허용됩니다. 단체 채널에서는 망상 조직에 보낸 단일 요청이 복수 응답을 생성할 수 있습니다.
이 샘플은 정적 Main 함수를 구현하여 IChat 양방향 계약으로 IClientChannel을 만듭니다. 이 함수는 구성 파일에 지정된 끝점을 사용합니다.
한 인스턴스가 보낸 메시지를 다른 모든 인스턴스가 받을 수 있도록 모든 Chat 인스턴스는 동일한 끝점 주소를 사용해야 합니다.
이 샘플의 Chat 인스턴스는 사용자 지정 확인자를 사용하거나 기본 PNRP(피어 확인자)를 사용하여 서로를 찾습니다. Windows Server 2003에서는 PNRP를 사용할 수 없습니다. 따라서 Windows Server 2003을 실행하는 시스템에서 이 샘플을 실행하려면 사용자 지정 확인자를 사용해야 합니다. 기본적으로 이 샘플은 사용자 지정 확인자를 사용하도록 설정되어 있습니다. 사용자 지정 확인자 또는 기본 확인자 중 어느 것을 사용해야 하는지는 다음 구성 파일에 정의된 채팅 끝점에 의해 결정됩니다. 기본 PNRP(피어 확인자)로 전환하려면 샘플 구성 파일의 bindingConfiguration 아래에서 BindingCustomResolver를 BindingDefault로 바꾸십시오.
<!-- Chat instance participating in the mesh. -->
<endpoint name="ChatEndpoint"
address="net.p2p://chatMesh/ServiceModelSamples/Chat"
binding="netPeerTcpBinding"
bindingConfiguration="BindingCustomResolver"
contract="Microsoft.ServiceModel.Samples.IChat">
</endpoint>
피어 노드가 Peer Channel Custom Peer Resolver 서비스와 통신할 수 있도록 하려면 구성 파일에서 Peer Channel Custom Peer Resolver의 클라이언트측 구성이 정의되어 있어야 합니다.
<!-- Client used to communicate with the custom resolver service. -->
<client>
<endpoint configurationName="CustomPeerResolverEndpoint"
address="net.tcp://localhost/ServiceModelsamples/peerResolverService"
binding="netTcpBinding"
bindingConfiguration="Binding3"
contract="Microsoft.ServiceModel.SamplesICustomPeerResolver">
</endpoint>
</client>
확인자 서비스의 주소를 식별하는 주소입니다. 확인자 서비스가 원격 컴퓨터에서 실행되는 경우에는 localhost를 정규화된 도메인 이름으로 바꾸십시오.
샘플은 IClientChannel에서 피어 노드를 검색하는 방법과 IOnlineStatus를 사용하여 온라인 및 오프라인 이벤트를 등록하는 방법도 보여 줍니다. 온라인 이벤트는 피어 노드가 망상 조직에 있는 적어도 하나의 다른 피어 노드에 연결될 때 시작됩니다. 오프라인 이벤트는 피어 노드가 망상 조직에서 더 이상 어느 피어 노드와도 연결되어 있지 않을 때 시작됩니다.
현재는 피어 채널이 서비스 메타데이터 유틸리티(Svcutil.exe)와 통합되어 있지 않기 때문에 메타데이터를 생성할 수 없습니다.
샘플을 실행할 때 Chat 인스턴스가 보낸 채팅 메시지는 다른 Chat 인스턴스의 콘솔 창에 표시됩니다. 각 콘솔 창에서 Q 키를 누른 다음 Enter 키를 누르면 인스턴스가 닫힙니다.
참고: |
---|
현재는 인프라에서 throw될 수 있는 모든 가능한 예외를 샘플이 처리하지 못합니다. 상용 또는 프로덕션 환경에서 이 샘플을 사용하는 경우에는 적절한 최상의 예외 처리 방법을 따르십시오. |