Chat del canal del mismo nivel

Download sample

El ejemplo Chat muestra cómo implementar una aplicación de chat con la participación de varios grupos mediante PeerChannel. El resto de las instancias reciben los mensajes enviados por cualquier instancia de una aplicación de chat.

El ejemplo Chat no está basado en el concepto de cliente y servicio. Es una aplicación real punto a punto, en la que cada instancia actúa como par de otras instancias. Cada instancia puede enviar mensajes a otras instancias y recibir mensajes de otras instancias utilizando el contrato dúplex IChat.

El ejemplo chat se basa en el ejemplo Host automático. Además, consulte Ejemplo de introducción para obtener información general de alto nivel de Windows Communication Foundation (WCF).

Nota

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

Conceptos clave:

PeerChannel es una tecnología de comunicaciones de punto a punto (P2P) entre varias partes en Windows Communication Foundation (WCF). Permite una mensajería segura, escalable y confiable. Un ejemplo común de una aplicación con varias partes que se puede beneficiar del PeerChannel es el caso de una aplicación colaborativa, como el chat, donde un grupo de personas conversan entre ellas de la misma manera que de punto a punto sin la necesidad de servidores. PeerChannel habilita la colaboración P2P, la distribución del contenido, el equilibrio de la carga y el procesamiento distribuido de los escenarios de consumidor y empresa.

PeerChannel presenta los siguientes conceptos nuevos:

  • Una red es una colección con nombre (un gráfico interconectado) de nodos del mismo nivel que pueden comunicarse entre sí y que están identificados por un identificador de red único.

    Nota

    Los nodos activos en la red publican sus nombres de red de manera que otros puedan encontrarlos. Una red tiene las características siguientes: ajusta para cambiar la pertenencia, tiene la conectividad elástica en un entorno en el que los nodos se combinan constantemente y dejan la red y se optimiza dinámicamente según los modelos de tráfico.

  • Un nodo del mismo nivel es un extremo en una red. Una única aplicación puede tener varios nodos del mismo nivel que participan en redes diferentes.

  • Una resolución del mismo nivel es responsable de resolver un id. de red en las direcciones de extremo de los nodos en la red. Un nodo del mismo nivel utiliza estas direcciones para conectarse a otros nodos en la red. Esto permite propagar los mensajes por toda la red.

El chat es una aplicación de consola. Cada instancia de una aplicación de conversación crea IDuplexChannel con la misma dirección del extremo. Todas las otras instancias (dado que todos ellos están utilizando la misma dirección) reciben por consiguiente, un mensaje que es enviado por una instancia de una aplicación de conversación en su canal del mismo nivel.

La aplicación chat define e implementa el contrato dúplex IChat. El contrato IChat sólo permite las operaciones unidireccionales porque ServiceModel no admite el paradigma de única-solicitud, respuesta-múltiple (en el caso de un canal multipartidario, una solicitud única que se envía a la red puede generar varias respuestas).

Este ejemplo implementa una función principal estática para crear IClientChannel con el contrato dúplex IChat y utiliza el extremo que se especifica en el archivo de configuración.

Todas las instancias de chat deben utilizar la misma dirección de punto final para asegurarse de que los mensajes enviados por una instancia los reciben todas las demás instancias.

Las instancias del chat en este ejemplo se encuentran unas a otras a través de una resolución personalizada o a través de la resolución del mismo nivel predeterminado (PNRP). Observe que PNRP no está disponible en Windows Server 2003. Por consiguiente, se debe utilizar una resolución personalizada para ejecutar este ejemplo en un sistema que esté ejecutando Windows Server 2003. De forma predeterminada, este ejemplo está configurado para utilizar una resolución personalizada. Si se usa una resolución personalizada o la resolución predeterminada la determina el punto final del chat definido en el archivo de configuración siguiente. Para cambiar a la resolución del mismo nivel predeterminada (PNRP), reemplace "BindingCustomResolver" por "BindingDefault" en bindingConfiguration en el archivo de configuración del ejemplo.

<!-- 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>

Para que el nodo del mismo nivel comunique con el servicio Resolución personalizada del mismo nivel de canal del mismo nivel, la configuración de cliente de Resolución personalizada del mismo nivel de canal del mismo nivel se define en el archivo de configuración.

<!-- 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>

La dirección identifica la dirección del servicio de resolución. Si el servicio de resolución se está ejecutando en un equipo remoto, reemplace localhost por un nombre de dominio completo.

El ejemplo también muestra cómo recuperar el nodo entre nodos del mismo nivel desde IClientChannel y cómo registrarse para los eventos en línea y sin conexión utilizando IOnlineStatus. Se inicia un evento en línea cuando el nodo del mismo nivel está conectado, al menos, a otro nodo del mismo nivel en la red. Se inicia un evento sin conexión cuando el nodo del mismo nivel ya no está conectado a ningún otro nodo del mismo nivel de la red.

Actualmente, no se pueden generar metadatos porque un canal del mismo nivel no se integra con la utilidad de metadatos del servicio (Svcutil.exe).

Al ejecutar el ejemplo, los mensajes de chat enviados por una instancia del chat se muestran en las ventanas de la consola de otras instancias del chat. Presione la tecla Q seguida de ENTRAR en cada ventana de la consola para cerrar la instancia.

Nota

El ejemplo no controla actualmente todas las posibles excepciones que puede producir la infraestructura. Si está utilizando estos ejemplos en un entorno comercial o de producción, siga los consejos recomendados para la gestión correcta de las excepciones.

Para configurar, generar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado Procedimiento de instalación único para ejemplos de Windows Communication Foundation.

  2. Para generar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Generación de ejemplos de Windows Communication Foundation.

  3. Para ejecutar el ejemplo en una configuración con un único equipo o con varios, siga las instrucciones de Ejecución de ejemplos de Windows Communication Foundation.

  4. Además, para el ejemplo de conversación, se aplican los pasos siguientes. Dondequiera que el paso 3 hace referencia al cliente y al servicio, esos pasos se aplican para separar instancias del ejemplo (dado que el ejemplo de conversación no tiene el concepto de cliente y servicio).

  5. Si bindingConfiguration está establecido en BindingDefault, asegúrese de que PNRP se instala y habilita en todos los equipos que se utilizan.

  6. Inicie tantas instancias de la aplicación como desee. Comience escribiendo un sobrenombre que distinguirá los mensajes enviados de una instancia del cliente determinada. Poco después de que se escriba este nombre, se pueden enviar los mensajes de chat a la red. Estos mensajes se deberían hacer eco de a todas las otras instancias con un nombre de miembro distinto (es decir, que no se mostrará ningún mensaje de un cliente con el mismo nombre y el propio mensaje de un cliente único no se hará eco en la consola).

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.