对等通道聊天

“聊天”示例演示如何使用对等通道实现多方聊天应用程序。一个聊天应用程序的任一实例发送的消息可被其他所有实例接收。

“聊天”示例并不基于客户端和服务的概念。它是一个真正的对等应用程序,其中每个实例都与其他实例对等。通过使用 IChat 双工协定,每个实例都可以向其他实例发送消息并从其他实例接收消息。

“聊天”示例基于自承载示例。有关 Windows Communication Foundation (WCF) 的高级概述,另请参阅入门示例

提示

本主题的末尾介绍了此示例的设置过程和生成说明。

关键概念:

对等通道是 WCF 中的一种多方对等 (P2P) 通信技术。它为应用程序开发人员提供了基于消息的、安全且可伸缩的 P2P 信道。可从对等通道中获益的多方应用程序的一个常见示例是协作应用程序,例如聊天应用程序,其中一组人以对等方式(无需服务器)相互聊天。对等通道可为消费者和企业方案启用 P2P 协作、内容分发、负载平衡和分布式处理。

对等通道引入了下列新概念:

  • 网格**是对等节点的命名集合(一种相互连接图),其中的对等节点可以在它们自身之间通信并且每个节点由一个唯一的网格 ID 来标识。

    提示

    网格中的活动节点发布其网格名称,以便其他节点可以找到它们。网格具有下列特征:根据不断变化的成员资格进行调整,在节点不断加入和离开网格的环境中具有弹性连接性,并根据流量模式动态优化。

  • “对等节点”**是网格中的终结点。一个应用程序可以具有加入不同网格的多个对等节点。

  • 对等解析程序**负责将网格 ID 解析为网格中节点的终结点地址。对等节点使用这些地址连接到网格中的其他节点。这样便可以在整个网格中传播消息。

聊天应用程序是一个控制台应用程序。聊天应用程序的每个实例都创建一个具有相同终结点地址的 IDuplexChannel。因此,聊天应用程序的一个实例在其对等通道上发送的消息可被其他所有实例接收(因为所有实例都使用相同的地址)。

聊天应用程序定义并实现 IChat 双工协定。IChat 协定只允许单向操作,因为 ServiceModel 不支持单请求/多响应范例(在多方通道的情况下,发送给网格的一个请求可以生成多个响应)。

此示例实现一个静态主函数,以便通过 IChat 双工协定并使用配置文件中指定的终结点来创建 IClientChannel

所有聊天实例都必须使用相同的终结点地址,以确保由一个实例发送的消息可以由所有其他实例所接收。

此示例中的聊天实例通过自定义解析程序或默认的对等解析程序 (PNRP) 来相互进行查找。请注意,PNRP 在 Windows Server 2003 上不可用。因此,若要在运行 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>

为了使对等节点与 对等通道自定义对等解析程序 服务通信,在配置文件中定义了 对等通道自定义对等解析程序 的客户端配置。

<!-- 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) 进行集成,所有当前无法生成元数据。

运行示例时,一个聊天实例发送的聊天消息会显示在其他聊天实例的控制台窗口中。在每个控制台窗口中按 Q 键然后按 Enter 可以关闭该实例。

提示

此示例当前不处理基础结构可能引发的所有可能的异常。如果要在商业或生产环境中使用这些示例,请遵循正确的异常处理最佳做法。

设置、生成和运行示例

  1. 请确保已经执行了 Windows Communication Foundation 示例的一次性安装过程

  2. 若要生成 C# 或 Visual Basic .NET 版本的解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。

  3. 若要用单机配置或跨计算机配置来运行示例,请按照运行 Windows Communication Foundation 示例中的说明进行操作。

  4. 此外,对于聊天示例,以下步骤同样适用。只要步骤 3 指的是客户端和服务,这些步骤就适用于此示例的单个实例(因为聊天示例没有客户端和服务的概念)。

  5. 如果 bindingConfiguration 设置为 BindingDefault,请确保在使用的所有计算机上安装并启用 PNRP。如果 bindingConfiguration 设置为 BindingCustomResolver,请确保在所有正在使用的计算机上启动了 Chat project/solution 目录的 Chat\<语言>\CustomerResolver\bin 目录下的自定义解析程序服务。

  6. 根据需要启动应用程序的任意多个实例。通过输入昵称开始聊天,昵称用于区分从特定客户端实例发送的消息。输入此名称之后,马上便可以将聊天消息发送到网格。这些消息应回送给具有不同成员名称的所有其他实例(也就是说,将不会显示来自具有相同名称的客户端的消息,而且一个客户端自己的消息不会回送到控制台上)。

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.